Программу dbx можно применять для отладки программ на уровне ассемблера. Можно просматривать и изменять адреса памяти, просматривать команды ассемблера и пошаговые инструкции, устанавливать точки прерывания и события трассировки по адресам памяти и просматривать регистры.
В приведенных ниже командах и примерах адрес - это выражение, значение которого равно адресу памяти. В наиболее общем виде адрес задается как целое число или как выражение, в котором вычисляется адрес идентификатора с помощью оператора & (амперсанд). В командах машинного уровня можно также задавать адрес в виде выражения, заключенного в круглые скобки. Адреса могут состоять из других адресов и операторов сложения (+), вычитания (-) и косвенной адресации (унарная операция *).
Дополнительная информация об отладке программ на машинном уровне с помощью dbx приведена в следующих разделах.
Для просмотра содержимого машинных регистров предназначена команда registers. Регистры делятся на три группы: регистры общего назначения, регистры с плавающей точкой и регистры управления системой.
Регистры общего назначения обозначаются $rномер, где номер - номер регистра.
Примечание: Значение регистра может быть равно шестнадцатеричному числу 0xdeadbeef. Это значение присваивается всем регистрам общего назначения при инициализации.
Регистры с плавающей точкой обозначаются $frномер, где номер - это номер регистра. По умолчанию содержимое регистров с плавающей точкой не выводится. Для просмотра необходимо сбросить переменную $noflregs программы отладки (unset $noflregs).
Поддерживаются следующие регистры управления системой:
С помощью приведенной ниже команды можно просматривать содержимое регистров (для этого необходимо указать начальный адрес и либо конечный адрес, либо число элементов в переменной Счетчик). Переменная Режим определяет способ представления содержимого памяти при печати.
Если переменная Режим
не задана, используется предыдущий режим. Начальный режим -
X. Поддерживаются следующие режимы печати:
В приведенном ниже примере выражения в круглых скобках могут использоваться как адреса:
(dbx) print &x 0x3fffe460 (dbx) &x/X 3fffe460: 31323300 (dbx) &x,&x+12/x 3fffe460: 3132 3300 7879 7a5a 5958 5756 003d 0032 (dbx) ($pc)/2i 100002cc (sub) 7c0802a6 mflr r0 100002d0 (sub + 0x4) bfc1fff8 stm r30,-8(r1)
Для отладки программы на машинном уровне используются почти те же команды, что и для отладки на символьном уровне. Команда stopi останавливает процессор при достижении определенного адреса, выполнении условия или изменении переменной. Команды tracei работают так же, как и команды символьной трассировки. Команда stepi выполняет одну или указанное Число машинных команд.
Если бы вы выполнили другую команду stepi в этой точке, то вы бы остановились на адресе 0x10000618, обозначенном как точка входа для процедуры printf. Если вы не планируете останавливаться на этом адресе, вы могли бы использовать команду return, чтобы продолжить выполнение со следующей команды в sub с адресом 0x100002e0. В этой точке команда nexti будет автоматически продолжать выполнение до адреса 0x10000428.
Если в вашей программе существует несколько нитей, то при останове программы на экран будет выдано символьное имя работающей нити. Например:
останов в sub по адресу 0x100002d4 ($t4) 10000424 (sub+0x4) 480001f5 bl 0x10000618 (printf)
Вы можете отлаживать программы, которые были переупорядочены на уровне команд с помощью команды fdpr (реструктурирование направленной программы с обратной связью, компонент Performance Toolbox для AIX). Если применяются опции оптимизации -R0 или -R2, то dbx может выдавать информацию о соответствии между преобразованными адресами команд и адресами в исходном исполняемом файле:
0xRRRRRRRR = fdpr[0xYYYYYYYY]
В данном примере 0xRRRRRRRR - переупорядоченный адрес, а 0xYYYYYYYY - исходный адрес. Кроме того, dbx использует записи обратной трассировки в исходной области команд для поиска связанных имен процедур для сообщения stopped in, команды func и обратной трассировки.
(dbx) stepi stopped in proc_d at 0x1000061c = fdpr[0x10000278] 0x1000061c (???) 9421ffc0 stwu r1,-64(r1) (dbx)
В предыдущем примере dbx указывает, что выполнение программы было остановлено в функции proc_d с адресом 0x1000061c в переупорядоченном текстовом разделе, который первоначально располагался по адресу 0x10000278. Дополнительная информация о fdpr содержится в описании команды fdpr.
Для просмотра набора команд из исходного файла предназначена команда listi программы dbx. В режиме по умолчанию программа dbx выдает список команд для архитектуры, в которой она работает. Можно переопределить режим по умолчанию с помощью переменных $instructionset и $mnemonics команды dbx set.
Дополнительная информация о просмотре и дизассемблировании команд приведена в описании команды listi программы dbx. Дополнительная информация о переопределении режима по умолчанию приведена в описании переменных $instructionset и $mnemonics команды dbx set.
Программа символьной отладки dbx - Обзор
Работа с программой отладки dbx
Просмотр и редактирование исходного файла с помощью программы отладки dbx