Книга: Основы программирования в 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
- Второй просмотр: детали
- Просмотр и изменение значений переменных
- Короткое обновление переменных
- 2.1 Имена переменных
- 11.3.4. Получение и установка переменных экземпляра
- Смысл этих переменных
- 11.3.9. Просмотр стека вызовов
- Первый просмотр: краткий обзор
- Значения переменных по умолчанию
- Просмотр списков на узле SharePoint
- Просмотр библиотек документов
- Просмотр каталогов