SDB(1) SDB(1)
НАЗВАНИЕ
sdb - символьный отладчик
СИНТАКСИС
sdb [-W] [-w] [об ектный_файл [образ_памяти [список_каталогов]]]
ОПИСАНИЕ
По команде sdb запускается символьный отладчик, пред-
назначенный для отладки программ на языках C и Фортран
77. Его можно использовать для анализа об ектных файлов
и образа памяти, а также для выполнения программ под
управлением пользователя.
Об ектный_файл - это файл с выполняемой программой, от-
компилированной с опцией -g (отладка). Если она не была
компилирована с опцией -g, возможности символьной от-
ладки ограничиваются, но об ектный_файл можно анализи-
ровать, равно как можно отлаживаться на уровне машинных
команд и процедур. По умолчанию об ектный_файл - a.out.
Образ_памяти - это файл с образом памяти, полученный
после завершения выполнения об ектного_файла. По умол-
чанию имя образа_памяти есть core. Образ_памяти не обя-
зан присутствовать; знак - на его месте ведет к игнори-
рованию образа.
Список_каталогов, в котором отдельные каталоги разделе-
ны двоеточием, используется для поиска файлов с исход-
ными текстами отлаживаемой программы.
Команда sdb обрабатывает следующие опции:
-W Если файлы с исходными текстами отсутствуют или
оказываются новее, чем об ектный_файл, выдается
предупреждение. Опция -W подавляет проверку и, со-
ответственно, выдачу предупреждения.
-w Разрешение изменять об ектный_файл и образ_памяти.
В каждый момент времени определены текущая строка и те-
кущий файл. Если образ_памяти существует и не игнориру-
ется, то первоначально текущими становятся строка и
файл с исходным текстом, содержащим последний выполняв-
шийся оператор. Если образа_памяти нет, текущими стано-
вятся первая строка процедуры main и соответствующий
файл. Текущую строку и текущий файл можно изменить пос-
редством команд анализа содержимого исходных файлов.
При отладке имена переменных пишутся точно так же, как
в языках C или Фортран 77. Доступ к переменным, локаль-
ным для некоторой процедуры, осуществляется посредством
конструкции процедура:переменная. Если имя процедуры не
указано, используется процедура, содержащая текущую
строку. Можно ссылаться на элемент структуры как на
структура.элемент; или, посредством указателей, как на
указатель->элемент; ссылка на элемент массива выглядит
как массив[номер]. Переход от указателя к указуемому
об екту записывается как указатель[0]. Допускаются ком-
бинации этих конструкций. Доступ к переменным из общих
блоков Фортрана осуществляется аналогично обращению к
элементам структур с заменой имени структуры на имя об-
щего блока. Переменные из непоименованного общего блока
записываются в виде .переменная.
Можно также указывать переменную, задав ее адрес. До-
пускается использование всех видов целых констант, при-
нятых в языке C, так что адреса могут задаваться в де-
сятичном, восьмеричном и шестнадцатеричном виде.
Если адрес указан на месте имени структурной перемен-
ной, то шаблоном структуры будет шаблон последней из
структур, к которой выполнялся доступ посредством sdb.
Вообще, sdb рассматривает структуру как набор перемен-
ных; при указании имени структуры выводятся все ее эле-
менты. Исключение составляет вывод адресов: выводится
адрес начала структуры, а не отдельных ее элементов.
Элементы многомерных массивов записываются в виде
массив[номер][номер]..., или массив[номер,номер,...].
На месте номера может употребляться также конструкция
номер;номер, задающая диапазон изменения индекса ("вы-
резку" из массива); * обозначает весь допустимый диапа-
зон данного индекса. Если символы * являются последними
в списке индексов, их можно опустить. При выдаче адре-
сов, как и в случае структур, сообщается адрес всего
массива или вырезки, но не адрес каждого из элементов.
Многомерные массивы-аргументы подпрограмм на языке
Фортран 77 не могут быть выведены как массивы, так как
они являются указателями, значения которых есть адреса
массивов. Сам массив может быть получен в символическом
виде из вызывающей функции. Кроме того, следует учиты-
вать, что sdb отсчитывает индексы от нуля.
Ссылка на конкретный экземпляр переменной из стека де-
лается в виде процедура:переменная,номер. При этом мо-
гут использоваться все описанные ранее способы доступа
к элементам структур и массивов. Номер - это номер по-
явления процедуры в стеке, считая ближайший к вершине
экземпляр первым. Если процедура не указана, использу-
ется та, что выполняется в данный момент.
Номера строк в исходном тексте задаются в виде имя_фай-
ла:номер или процедура:номер. В обоих случаях номер
отсчитывается от начала файла. По умолчанию использует-
ся текущий файл. Если не указан номер строки, то ис-
пользуется первая строка файла или процедуры.
Можно оперировать не только со строками исходного текс-
та, но и с адресами, используя конструкцию адрес:.
Пока под управлением sdb выполняется процесс (см. ниже
команды r и k), все адреса относятся к программе про-
цесса; в другие моменты они относятся к об ектному_фай-
лу или образу_памяти.
Адресация в файле
Отладчик sdb позволяет работать с двумя файлами - об -
ектным и образом памяти. При этом адрес_в_файле получа-
ется из указанного пользователем адреса с помощью ото-
бражения, ассоциированного с каждым из двух файлов.
Отображение задается двумя тройками (b1, e1, f1) и (b2,
e2, f2). Адрес_в_файле вычисляется следующим образом:
если b1 <= адрес < e1 то
адрес_в_файле = адрес + f1 - b1
иначе если b2 <= адрес < e2 то
адрес_в_файле = адрес + f2 - b2
иначе адрес некорректен
Изначально оба отображения настроены на файлы типов
a.out(4) и core(4) соответственно. Если какой-либо из
указанных в командной строке файлов имеет неподходящий
тип, b1 и f1 устанавливаются равными 0, e1 полагается
равным максимально допустимому размеру файлов; тем са-
мым можно обращаться к произвольному месту файла без
преобразования адреса.
Для того, чтобы sdb мог работать с большими файлами,
элементы троек хранятся как 32-разрядные целые числа со
знаком.
Команды
Команды для просмотра данных
t Вывести стек вызовов завершившейся или остановлен-
ной программы.
T Вывести вершину стека вызовов.
переменная/clm
Вывести значение переменной с учетом длины l и
формата m. Число c - счетчик, означающий, что со-
держимое области памяти, начинающейся по адресу
указанной переменной, будет выведено как c пере-
менных заданного типа. Спецификаторы длины:
b Один байт.
h Два байта (полуслово).
l Четыре байта (слово).
Спецификаторы формата:
c Символ.
d Десятичное целое.
u Десятичное целое без знака.
o Восьмеричное целое.
x Шестнадцатеричное целое.
f 32-разрядное вещественное число одинарной
точности.
g 64-разрядное вещественное число двойной
точности.
s Переменная есть указатель на цепочку сим-
волов; выводятся символы этой цепочки.
a Вывести цепочку символов, начиная с адреса
переменной; нельзя использовать с регист-
ровыми переменными.
p Указатель на процедуру.
i Дизассемблировать машинную команду и вы-
вести указанные в ней адреса в числовом и
символическом виде.
I Дизассемблировать машинную команду и вы-
вести указанные в ней адреса только в чис-
ловом виде.
Спецификатор длины может использоваться только с
форматами c, d, u, o и x. Любая из спецификаций
clm может быть опущена. Если опущены все специфи-
кации, то sdb подбирает подходящую длину и формат
в соответствии с типом переменной. Если указана
спецификация m, то для вывода используется задан-
ный формат. Задание спецификации l может привести
к усечению выводимых данных. Счетчик c задает ко-
личество единиц памяти, начиная от адреса перемен-
ной, которые надлежит вывести. Количество байт в
этой единице определяется спецификатором l или,
если он не указан, размером указанной переменной.
Если счетчик указан со спецификаторами формата s
или a, то он определяет количество выводимых сим-
волов; иначе цепочка выводится до нулевого байта
или до 128 символов включительно. Последнюю из
просматривавшихся переменных можно повторно вывес-
ти командой ./. Если просматривалась структурная
переменная, по команде ./ выводится только послед-
ний элемент структуры.
Метасимволы языка sh(1) * и ? могут использоваться
в шаблонах имен процедур и переменных. Таким обра-
зом в ограниченном виде предоставляются средства
сопоставления с шаблонами. Если не указано имя
процедуры, то шаблон сравнивается с глобальными и
локальными для данной процедуры именами перемен-
ных; если имя процедуры задано - то только с име-
нами ее локальных переменных. Для сравнения только
с именами глобальных переменных используйте форму
:шаблон.
номер_строки?lm
переменная:?lm
Вывести содержимое области памяти, начинающейся с
адреса, заданного номером_строки или переменной
(именем процедуры), по формату lm. Формат по умол-
чанию - i.
переменная=lm
номер_строки=lm
число=lm
Вывести адрес переменной, номера_строки или значе-
ние числа по формату, заданному lm. Формат по
умолчанию - lx. Последний вариант команды исполь-
зуется для перевода чисел из одной системы счисле-
ния в другую.
переменная!значение
Присвоить переменной указанное значение. Значение
может быть числом, символьной константой или пере-
менной. Значение должно быть определено; выраже-
ния, результатом которых является несколько значе-
ний (например, структуры) недопустимы. Символьные
константы записываются в виде 'символ. Числа расс-
матриваются как целые; только если есть десятичная
точка или показатель степени, число рассматривает-
ся как вещественное двойной точности. Регистры
рассматриваются как целые. Переменная может быть
выражением, которое означает более чем одну пере-
менную (например, имя массива или структуры). Если
указан адрес переменной, то считается, что эта пе-
ременная имеет тип int. Если для присваивания не-
обходимо преобразование типов, используются согла-
шения языка C.
x Вывести содержимое машинных регистров и текущую
машинную команду.
X Вывести текущую машинную команду.
Команды для просмотра файлов с исходными текстами
e процедура
e имя_файла
e каталог/
e каталог имя_файла
Первые две формы команды об являют текущим файл,
содержащий процедуру или называющийся имя_файла.
Текущей строкой становится первая строка в указан-
ной процедуре или в файле. Исходный файл берется
из указанного каталога (по умолчанию из текущего
каталога). Последние две формы команды изменяют
текущий каталог. По команде e без аргументов вы-
даются имена текущей процедуры и текущего файла.
/регулярное_выражение/
Поиск строки, содержащей цепочку символов, сопос-
тавляющуюся с регулярным_выражением в смысле
ed(1). Поиск выполняется в прямом направлении, на-
чиная с текущей строки.
?регулярное_выражение?
То же, что и предыдущая команда, только поиск вы-
полняется в обратном направлении.
p Вывести текущую строку.
z Вывести текущую строку и следующие за ней 9 строк.
Текущей станет последняя выведенная строка.
w Окно. Вывести 10 строк вокруг текущей строки.
номер
Сделать текущей строку с указанным номером и вы-
вести ее.
число+
Продвинуться вперед на заданное число строк и вы-
вести новую текущую строку.
число-
Переместиться назад на заданное число строк и вы-
вести новую текущую строку.
Команды управления выполнением программы
счетчик r аргументы
счетчик R
Начать выполнение программы с заданными аргумента-
ми. Команда r без аргументов запускает программу с
предыдущим набором аргументов, а R - действительно
без аргументов. Аргументы, начинающиеся с < или >,
означают переназначение стандартного ввода или вы-
вода соответственно. Если счетчик задан, будет
проигнорировано (счетчик-1) точек прерывания.
номер_строки c счетчик
номер_строки C счетчик
Продолжить выполнение после точки прерывания или
настоящего прерывания. Если счетчик задан, будет
проигнорировано (счетчик-1) точек прерывания. По
команде C выполнение будет продолжено с возбужде-
ния сигнала, вызвавшего приостановку программы, а
по команде c этот сигнал проигнорируется. Если
указан номер_строки, то перед началом выполнения в
заданную строку будет вставлена временная точка
прерывания, которая после завершения команды будет
удалена.
номер_строки g счетчик
Продолжить выполнение после точки прерывания, на-
чиная со строки с заданным номером. Если счетчик
задан, будет проигнорировано (счетчик-1) точек
прерывания.
s счетчик
S счетчик
Пошаговое выполнение программы. Счетчик указавает
количество строк, выполняемых за один шаг; по
умолчанию выполняется одна строка. По команде S
отлаживается только текущая процедура - строки вы-
зываемых процедур не учитываются.
i
I Пошаговое выполнение машинных команд. По команде I
выполнение будет продолжено с возбуждения сигнала,
вызвавшего приостановку программы, а по команде i
этот сигнал игнорируется.
переменная$m счетчик
адрес:m счетчик
Аналогично s, но выполняется до тех пор, пока по
указанному адресу не будет занесено новое значе-
ние. Переменная должна быть доступна из текущей
процедуры. Если счетчик не указан, его можно счи-
тать бесконечно большим. Так как данная команда
выполняется программно, она работает крайне мед-
ленно.
уровень v
Задать полноту выводимой информации при выполнении
команд s, S, m. Если уровень опущен, то выводится
только название подпрограммы и исходного файла.
Если уровень 1 или больше, то при выполнении выво-
дится также исходная строка. Если уровень 2 или
больше, то также выводятся все команды ассемблера,
соответствующие данной строке.
k Терминировать процесс, выполняющий отлаживаемую
программу.
процедура(арг1, арг2, ... )
процедура(арг1, арг2, ... )/m
Выполнить указанную процедуру с заданными аргумен-
тами. Аргументы могут быть целыми числами, симво-
лами, цепочками символов или именами переменных,
доступных из текущей процедуры. Во втором варианте
результат выполнения процедуры выводится в формате
m (по умолчанию d). Выполнить отдельную процедуру
можно, лишь если редактирование связей осуществля-
лось командой cc -g.
номер_строки b команды_отладчика
Установить точку прерывания на указанную строку.
Если указано имя процедуры без номера_строки (нап-
ример, proc:), точка прерывания устанавливается на
первую строку процедуры, даже если она компилиро-
валась без опции -g. Если номер_строки не указан,
то точка прерывания устанавливается на текущую
строку. Если команды_отладчика не указаны, то вы-
полнение приостанавливается перед точкой прерыва-
ния и управление возвращается sdb. Иначе при дос-
тижении точки прерывания выполняются указанные ко-
манды_отладчика и работа программы продолжается.
Если команд несколько, они разделяются точкой с
запятой. Если в качестве команды используется k,
то управление передается sdb.
B Вывести список точек прерывания.
номер_строки d
Снять точку прерывания с заданной строки. Если но-
мер_строки не указан, то запрашивается подтвержде-
ние на удаление каждой точки прерывания: выдается
ее местоположение и читается ответ (со стандартно-
го ввода). Если ответ начинается с y или d, то
точка прерывания снимается.
D Удалить все точки прерывания.
l Вывести последнюю выполненную строку.
номер_строки a
Оповещение. Если номер_строки имеет вид процеду-
ра:номер, то выполняется команда номер_строки b l.
Если номер_строки имеет вид процедура:, то выпол-
няется команда процедура: b T.
Прочие команды
!команда
Команда интерпретируется shell'ом [см. sh(1)].
перевод_строки
Если предыдущая команда выводила строку исходной
программы, то после нажатия клавиши "перевод стро-
ки" будет выведена следующая строка исходного
текста, которая и станет текущей. Если предыдущая
команда выводила содержимое ячейки памяти, то вы-
водится содержимое следующей ячейки.
CTRL+D
"Прокрутить". Вывести следующие 10 строк исходного
текста, команд или данных в зависимости от того,
что выводилось в последний раз.
<имя_файла
Читать команды из указанного файла; по достижении
его конца читать команды со стандартного ввода.
Эта команда не может быть вложенной.
M Вывести тройки, управляющие отображениями адресов.
М [?/] [*] b e f
Изменить тройку, управляющую отображением адресов.
Аргументы ? и / указавают на отображения, ассоции-
рованные с об ектным_файлом и образом_памяти соот-
ветственно. Если не указана *, то изменяется пер-
вая тройка (b1, e1, f1), иначе - вторая. Если за-
дано меньше трех значений, то оставшиеся элементы
тройки остаются неизменными.
"строка
Вывести указанную строку. Разрешается использовать
управляющие последовательности языка C \символ,
где символ не есть цифра.
q Выйти из отладчика.
Команды отладки отладчика
V Вывести версию отладчика.
Q Вывести список отлаживаемых файлов и процедур.
Y Переключить режим выдачи внутренней отладочной ин-
формации.
ФАЙЛЫ
a.out
core
СМ. ТАКЖЕ
cc(1), f77(1), sh(1).
a.out(4), core(4), syms(4) в Справочнике программиста.
ПРЕДОСТЕРЕЖЕНИЯ
При выводе значения внешней переменной, для которой от-
сутствует отладочная информация, перед ее значением вы-
водится предупреждение. Ее типом по умолчанию считается
int.
Данные, хранящиеся в секции команд, недоступны из функ-
ций.
Если функция была оптимизирована, то информация о номе-
рах строк может не соответствовать действительности.
Более того, часть информации может быть потеряна.
СЮРПРИЗЫ
Если процедура вызвана, когда программа не остановилась
на точке прерывания (например, при отладке образа памя-
ти), то перед началом выполнения процедуры все перемен-
ные инициализируются. Это делает невозможным использо-
вание процедур, которые осуществляют форматный вывод
данных из образа памяти.
Отладчик sdb плохо приспособлен для отладки Форт-
ран-программ. Трудно получить доступ к элементам общих
блоков и формальным аргументам, элементы многомерных
массивов нумеруются по строкам, а не по столбцам. Кроме
того, sdb несовместим с компилятором svs(1). Рекоменду-
ем пользоваться отладчиком КРОТ.
|