Книга: Основы программирования в Linux

Просмотр переменных

Просмотр переменных

Отладчик вывел данные в момент остановки программы, и в трассировке стека показаны значения аргументов функции.

Функция sort была вызвана с параметром а, значение которого 0х804а040. Это адрес массива. Обычно он в различных системах разный и зависит от используемых компилятора и операционной системы.

Сбойная строка 23 — сравнение одного элемента массива с другим:

/* 23 */ if (a[j].key > a[j+1].key) {

Отладчик можно применять для просмотра содержимого параметров функции, локальных переменных и глобальных данных. Команда print отображает содержимое переменных и других выражений:

(gdb) print j
$1 = 4

Вы видите, что у локальной переменной j значение 4. Любые значения, выводимые командами gdb, подобными данной, сохраняются для будущего использования в псевдопеременных. В данном случае переменной $1 присвоено значение 4, на случай, если она вам позже понадобится. Последующие команды будут сохранять свои результаты в переменных $2, $3 и т.д.

Значение переменной j, равное 4, означает, что программа попыталась выполнить оператор

if (а[4].key > а[4+1].key)

У массива array, который вы передали функции sort, только пять элементов, которые пронумерованы от 0 до 4. Поэтому данный оператор считывает несуществующий элемент массива array[5]. Переменная цикла j приняла некорректное значение.

Если ваша программа завершилась в строке 25, система обнаружила чтение за пределами массива, только когда взялась за перестановку элементов массива, выполнив оператор

/* 25 */ а[j] = a[j+1];

который при j, равной 4, дает в результате

а[4] = а[4+1];

Просмотреть элементы передаваемого массива можно, применив выражение в команде print. В программе gdb вы можете использовать почти любое допустимое выражение языка С для вывода значения переменной, элемента массива или указателя.

(gdb) print а[3]
$2 = {data = "alex", '' <repeats 4091 times>, key = 1}
(gdb)

Отладчик gdb сохраняет результаты выполнения команд в псевдопеременных вида $<номер>. Результат последней команды всегда хранится в псевдопеременной $, а предыдущей — в $$. Это позволяет результат одной команды использовать в другой. Например:

(gdb) print j
$3 = 4
(gdb) print a[$-1].key
$4 = 1

Оглавление книги


Генерация: 0.777. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз