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). Рекомендуем пользоваться отладчиком КРОТ.