Как выглядят символы отладки? - PullRequest
7 голосов
/ 18 июня 2011

gcc (GCC) 4.6.0 GNU GDB (GDB) Fedora (7.2.90.20110525-38.fc15)

У меня недавно была проблема, когда я пытался отладить свою проблему с помощью gdb. Когда я загружал свой бинарный файл, GDB жаловался: «Символы отладки не найдены»

Итак, когда я сделал следующее:

nm ass1

Я получил следующий вывод (только образец)

00000000006026e0 t __init_array_end
00000000006026d0 t __init_array_start
00000000004020e0 T __libc_csu_fini
0000000000402050 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
00000000006029ec A _edata
0000000000602b28 A _end
000000000040212c T _fini
0000000000401420 T _init
0000000000401610 T _start
                 U atoi@@GLIBC_2.2.5
000000000040163c t call_gmon_start
0000000000602b10 b completed.5886
00000000006029e8 W data_start
0000000000602b18 b dtor_idx.5888
00000000004016d0 t frame_dummy
00000000004016f4 T main

Проблема в том, что я забыл добавить -g. Поэтому я решил скомпилировать с -g и снова запустить nm. Я получил аналогичный вывод, он содержит символы отладки, как я использовал -g, и на этот раз GDB не жаловался:

                 U __libc_start_main@@GLIBC_2.2.5
00000000006029ec A _edata
0000000000602b28 A _end
000000000040212c T _fini
0000000000401420 T _init
0000000000401610 T _start
                 U atoi@@GLIBC_2.2.5
000000000040163c t call_gmon_start
0000000000602b10 b completed.5886
00000000006029e8 W data_start
0000000000602b18 b dtor_idx.5888
00000000004016d0 t frame_dummy
00000000004016f4 T main
                 w pthread_cancel

Кроме того, двоичный файл больше по размеру. Я мог заметить другое, используя нм. Мне интересно, что я должен искать? Как выглядят символы отладки?

Большое спасибо за любые предложения,

1 Ответ

7 голосов
/ 18 июня 2011

nm скрывает символы отладки по умолчанию.Используйте параметр -a, чтобы показать их.

Современные системы часто не используют символы отладки per se .Формат отладки stabs был разработан для использования с исполняемыми файлами формата a.out, которые могут представлять только ограниченную часть внутренней структуры;это привело к тому, что в таблице символов было спрятано много вещей, таких как символы отладки и инициализаторы / конструкторы .Форматы файлов COFF (в настоящее время в основном устарели) и ELF позволяют использовать произвольные разделы, а большинство современных дистрибутивов Linux настраивают gcc для использования DWARF 2 отладочной информации.Вы должны быть в состоянии использовать GNU objdump для проверки этой информации.

(У меня нет доступа к машине, чья binutils будет генерировать stabs или GNU stabs+ формат, поэтому я откладываю Google для деталей.)

...