Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
data = "john", ' ' <repeats 4091 times>, key =2}, { data = "neil", ' ' <repeats 4091 times>, key = 4}, { data = "alex", ' ' <repeats 4091 times>, key =1}, { data = "rick", ' ' <repeats 4091 times>, key =5}}(gdb)Можно воспользоваться командой
display(gdb) <b>display array[0]@5</b>1: array[0]@5 = {{data = "bill", ' ' <repeats 4091 times>, key = 3}, { data = "john", ' ' <repeats 4091 times>, key = 2}, { data = "neil", ' ' <repeats 4091 times>, key = 4}, { data = "alex", ' ' <repeats 4091 times>, key = 1}, { data = "rick", ' ' <repeats 4091 times>, key, = 5}}Более того, вы можете изменить точку останова таким образом, что вместо остановки программы она просто отобразит данные, которые вы запросили, и продолжит выполнение. Для этого примените команду
commands(gdb)<b> commands</b>Type commands for when breakpoint 1 is hit, one per line.End with a line saying just "end".> <b>cont</b>> <b>end</b>Теперь, когда вы разрешите программе продолжить выполнение, она продолжается до завершения, выводя значение массива каждый раз, когда оказывается вблизи внешнего цикла.
(gdb) <b>cont</b>Continuing.Breakpoint 1, sort (a=0x8049684, n=3) at debug4.c:2121 /* 21 */ s = 0;1: array[0]@5 = {{data = "john", ' 00' <repeats 4091 times>, key = 2}, { data = "bill", ' 00' <repeats 4091 times>, key =3}, { data = "alex", ' 00' <repeats 4091 times>, key =1}, { data = "neil", ' 00' <repeats 4091 times>, key =4}, { data = "rick", ' 00' <repeats 4091 times>, key = 5}}array[0] = {john, 2}array[1] = {alex, 1}array[2] = {bill, 3}array[3] = {neil, 4}array[4] = {rick, 5}Program exited with code 025.(gdb)Отладчик gdb сообщает о том, что программа завершается с необычным кодом завершения. Это происходит потому, что программа сама не вызывает
exitmainexitКажется, что программа не выполняет внешний цикл столько раз, сколько ожидалось. Вы можете увидеть, что значение параметра
nn/* 30 */ n--;Это попытка оптимизировать программу за счет того, что в конце каждого прохода внешнего цикла наибольший, элемент
arrayВставка исправлений с помощью отладчика
Вы уже видели, что можно применять отладчик для установки точек останова и просмотра значений переменных. Применив точки останова с заданными действиями, можно проверить исправление, называемое "заплатой", перед тем, как изменять текст программы и выполнять ее повторную компиляцию. В данном случае нужно остановить программу в строке 30 и увеличить переменную
nДавайте перезапустим программу с самого начала. Прежде всего вы должны удалить вашу точку останова и отладочный вывод. С помощью команды info можно увидеть, какие точки останова и какой вывод вы включили:
(gdb)<b> info display</b>Auto-display expressions now in effect:Num Enb Expression1: y array[0]@5 (gdb)<b> info break</b>Num Type Disp Enb Address What1 breakpoint keep y 0x08048427 in sort at debug4.c:21 breakpoint already hit 3 times contВы можете либо отключить эти точки останова, либо удалить их совсем. Если их отключить, у вас останется возможность включить их позже, когда понадобится.
(gdb) <b>disable break 1</b>(gdb) <b>disable display 1</b>(gdb) <b>break 30</b>Breakpoint 2 at 0x8048545: file debug4.c, line 30.(gdb) <b>commands 2</b>Type commands for when breakpoint 2 is hit, one per line.End with a line saying just "end".><b>set variable n = n+1</b>><b>cont</b>><b>end</b>
