Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Увидеть, как вы добрались до этого места, можно с помощью команды
backtrace
(gdb)<b> backtrace</b>
#0 0x0804846f in sort (a=0x804a040, n=5) at debug3.c:23
#1 0x08048583 in main() at debug3.c:37
(gdb)
Это очень простая программа и трассировка у нее короткая, т.к. вы не вызывали много функций из других функций. Вы только видите, что
sort
main
backtrace
У команды
backtrace
bt
where
Просмотр переменных
Отладчик вывел данные в момент остановки программы, и в трассировке стека показаны значения аргументов функции.
Функция
sort
а
Сбойная строка 23 — сравнение одного элемента массива с другим:
/* 23 */ if (a[j].key > a[j+1].key) {
Отладчик можно применять для просмотра содержимого параметров функции, локальных переменных и глобальных данных. Команда
print
(gdb) <b>print j</b>
$1 = 4
Вы видите, что у локальной переменной
j
4
$1
$2
$3
Значение переменной
j
if (а[4].key > а[4+1].key)
У массива
array
sort
array[5]
j
Если ваша программа завершилась в строке 25, система обнаружила чтение за пределами массива, только когда взялась за перестановку элементов массива, выполнив оператор
/* 25 */ а[j] = a[j+1];
который при
j
а[4] = а[4+1];
Просмотреть элементы передаваемого массива можно, применив выражение в команде
print
(gdb) <b>print а[3]</b>
$2 = {data = "alex", ' ' <repeats 4091 times>, key = 1}
(gdb)
Отладчик gdb сохраняет результаты выполнения команд в псевдопеременных вида
$<<i>номер</i>>
$
$$
(gdb) <b>print j</b>
$3 = 4
(gdb) <b>print a[$-1].key</b>
$4 = 1
Вывод листинга программы
Вы можете в программе gdb вывести на экран исходный текст программы с помощью команды
list
list
list
(gdb) <b>list</b>
18 /* 18 */ int s = 1;
19 /* 19 */
20 /* 20 */ for(; i < n && s != 0; i++) {
21 /* 21 */ s = 0;
22 /* 22 */ for(j = 0; j < n; j++) {
23 /* 23 */ if(a[j].key > a[j+1].key) {
24 /* 24 */ item t = a[j];
25 /* 25 */ a[j] = a[j+1];
26 /* 26 */ a[j+1] = t;
27 /* 27 */ s++;
(gdb)
В строке 22 задано выполнение цикла до тех пор, пока переменная
j
n
n
j
а[4]
а[5]
j < n-1
Давайте внесем это изменение, назовем новую программу debug4.c, откомпилируем ее и попробуем снова выполнить.
/* 22 */ for(j = 0; j < n-1; j++) {
$ <b>cc -g -o debug4 debug4.с</b>
$ <b>./debug4</b>
array[0] = {john, 2}
array[1] = {alex, 1}
array[2] = {bill, 3}
array[3] = {neil, 4}
array[4] = {rick, 5}
Программа все еще не работает, поскольку она вывела неверно отсортированный список. Попробуем применить gdb для пошагового выполнения программы.