5. Отладчик gdb
GDB предоставляет все перечисленные возможности. Он называется отладчиком на уровне исходного текста, создавая иллюзию, что Вы выполняете операторы C++ из Вашей программы, а не машинный код, в который они действительно транслируются.
Для иллюстрации мы используем систему, которая компилирует программы на C++ в исполняемые файлы, содержащие машинный код. В результате этого процесса информация об оригинальном коде C++ теряется при трансляции. Отдельный оператор C++ обычно преобразуется в несколько машинных команд, а большинство имен локальных переменных просто теряется. Информация о именах переменных и операторах C++ в Вашей исходной программе не является необходимой для ее выполнения. Поэтому, для правильной работы отладчика на уровне исходного текста, компилятор должен поместить в программу некоторую дополнительную информацию. Обычно ее добавляют к информации, используемой компоновщиком, в исполняемый файл.
Чтобы указать компилятору (gcc), что Вы планируете отлаживать Вашу программу, и поэтому нуждаетесь в дополнительной информации, добавьте ключ -g в опции компиляции и компоновки. Например, если Ваша программа состоит из двух файлов main.C и utils.C, Вы можете откомпилировать ее командами
gcc -c -g -Wall main.C
gcc -c -g -Wall utils.C
gcc -g -o myprog main.ob utils.o
6. Команда nm
Команда nm выдает на стандартный вывод таблицу имен для каждого объектного файла, указанного в командной строке. Файл может быть как перемещаемым, так и абсолютным объектным файлом, или может быть архивом из таких файлов. Для каждого элемента таблицы выдается следующая информация:
Name |
Имя элемента таблицы. |
Value |
Значение, выражаемое как смещение или адрес, в зависимости от класса хранения. |
Class |
Класс хранения. |
Type |
Информация о типе. Если элемент описывает экземпляр структуры или об единения, то за типом будет выведено имя структуры или об единения (например, struct-имя). Если элемент соответствует массиву, то размер массива будет указан за типом (например, char[n][m]). Заметим, что для наличия этой информации файл должен быть откомпилирован командой cc(1)с опцией -g. |
Size |
Размер в байтах, если он определен. Заметим, что для наличия этой информации файл должен быть откомпилирован командой cc(1)с опцией -g. |
Line |
Номер строки в файле с исходным текстом, в которой об ект определяется, если эта информация имеет смысл. Заметим, что для наличия этой информации файл должен быть откомпилирован командой cc(1)с опцией -g. |
Section |
Для об ектов с классом хранения статический (static) и внешний (extern) указывается секция, которой принадлежит об ект: секция команд (.text), секция инициализированных данных (.data) или секция неинициализированных данных (.bss). |
Для нашего случая используем nm myprog
7. Утилита objdump
1) Для любой функции программы получить с помощью утилиты objdump ее бинарный и ассемблерный код с соответствующими сороками на С
objdump –d os2.o
2) С помощью утилиты objdump, определить в какой секции хранятся символьные строки, и в какой исполняемый код программы
objdump –h myprog