(gdb) print array[0]
$1 = (data = "bill", '\0'
Для вывода нескольких последовательных элементов массива можно применить конструкцию @<
(gdb) print array[0]@5
$2 = {{data = "bill", '\0'
data = "neil", '\0'
data = "john", '\0'
data = "rick", '\0'
data = "alex", '\0'
Учтите, что вывод немного подчищен, чтобы его легче было читать. Поскольку это первый проход цикла, массив еще не изменен. Когда вы разрешите программе продолжить выполнение, то увидите последовательные перестройки массива array, происходящие по мере выполнения программы:
(gdb) cont
Continuing.
Breakpoint 1, sort (a=0x8049580, n=4) at debug4.c:21
21 /* 21 */ s = 0;
(gdb) print array[0]@5
$3 = {{data = "bill", '\0'
data = "john", '\0'
data = "neil", '\0'
data = "alex", '\0'
data = "rick", '\0'
(gdb)
Можно воспользоваться командой display
(gdb) display array[0]@5
1: array[0]@5 = {{data = "bill", '\0'
data = "john", '\0'
data = "neil", '\0'
data = "alex", '\0'
data = "rick", '\0'
Более того, вы можете изменить точку останова таким образом, что вместо остановки программы она просто отобразит данные, которые вы запросили, и продолжит выполнение. Для этого примените команду commands
(gdb) commands
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
> cont
> end
Теперь, когда вы разрешите программе продолжить выполнение, она продолжается до завершения, выводя значение массива каждый раз, когда оказывается вблизи внешнего цикла.
(gdb) cont
Continuing.
Breakpoint 1, sort (a=0x8049684, n=3) at debug4.c:21
21 /* 21 */ s = 0;
1: array[0]@5 = {{data = "john", '\000'
data = "bill", '\000'
data = "alex", '\000'
data = "neil", '\000'
data = "rick", '\000'
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 сообщает о том, что программа завершается с необычным кодом завершения. Это происходит потому, что программа сама не вызывает exit
main. Код завершения в данном случае не имеет смысла, значимый код должен предоставляться вызовом функции exit.Кажется, что программа не выполняет внешний цикл столько раз, сколько ожидалось. Вы можете увидеть, что значение параметра n
n в строке 30./* 30 */ n--;
Это попытка оптимизировать программу за счет того, что в конце каждого прохода внешнего цикла наибольший, элемент array
Вставка исправлений с помощью отладчика