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