НАЗВАНИЕ
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-разрядные целые числа со знаком.
Команды
Команды для просмотра данных
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) * и ? могут использоваться в шаблонах имен процедур и переменных. Таким образом в ограниченном виде предоставляются средства сопоставления с шаблонами. Если не указано имя процедуры, то шаблон сравнивается с глобальными и локальными для данной процедуры именами переменных; если имя процедуры задано - то только с именами ее локальных переменных. Для сравнения только с именами глобальных переменных используйте форму :шаблон.
Команды для просмотра файлов с исходными текстами
Команды управления выполнением программы
Прочие команды
Команды отладки отладчика
ФАЙЛЫ
a.out core
СМ. ТАКЖЕ
cc(1), f77(1), sh(1).
a.out(4), core(4), syms(4) в Справочнике программиста.
ПРЕДОСТЕРЕЖЕНИЯ
При выводе значения внешней переменной, для которой отсутствует отладочная информация, перед ее значением выводится предупреждение. Ее типом по умолчанию считается
int.
Данные, хранящиеся в секции команд, недоступны из функций.
Если функция была оптимизирована, то информация о номерах строк может не соответствовать действительности. Более того, часть информации может быть потеряна.
СЮРПРИЗЫ
Если процедура вызвана, когда программа не остановилась
на точке прерывания (например, при отладке образа памяти), то перед началом выполнения процедуры все переменные инициализируются. Это делает невозможным использование процедур, которые осуществляют форматный вывод
данных из образа памяти.
Отладчик sdb плохо приспособлен для отладки Фортран-программ. Трудно получить доступ к элементам общих блоков и формальным аргументам, элементы многомерных массивов нумеруются по строкам, а не по столбцам. Кроме того, sdb несовместим с компилятором svs(1). Рекомендуем пользоваться отладчиком КРОТ.