Определить имя исходного файла для символа в отладчике gdb

Я отлаживаю приложение на основе нескольких общих библиотек C++ в gdb в Ubuntu 18.04 и хотите найти исходный код (или, по крайней мере, имя общей библиотеки или пространства имен C++) символа с именем TRUE.

Весь код скомпилирован с -g3 -O0 -Wall.

Изменить: у меня есть "только" символы отладки, доступные для общих библиотек, а код приложения скомпилирован с-g3 -O0 -Wall.

Вот что я знаю о символе в gdb:

(gdb) ptype TRUE
type = enum {FALSE, TRUE}
(gdb) whatis TRUE
type = enum {...}
(gdb) info line TRUE
(gdb) 

Как узнать, кто определил enum моего TRUE символ`?

Есть аналогичный вопрос, но ответ не дает ожидаемого результата (но пуст, см. Журнал выше): /questions/33764171/gnu-gdb-kak-pokazat-imya-ishodnogo-fajla-i-stroki-simvola/33764179#33764179

Изменить: я сделал еще один шаг (но для такого распространенного имени файла все еще отсутствует полный путь):

(gdb) python print(gdb.lookup_symbol("TRUE")[0].symtab)
api.cpp

2 ответа

Я наконец нашла! Python - это решение,gdb объект в Python предлагает более подробную информацию, чем чистый собственный gdb команды:

(gdb) python print(gdb.lookup_symbol("TRUE")[0].symtab.fullname())
/media/devmount/dev/R/Rcpp/src/api.cpp

Подробности см. В документации: https://sourceware.org/gdb/download/onlinedocs/gdb/Symbol-Tables-In-Python.html.

Изменить: я нашелgdb для этого, но, похоже, в моем случае она не работает:

(gdb) set print symbol-filename on
(gdb) show print symbol-filename
Printing of source filename and line number with <symbol> is on.
(gdb) ptype TRUE
type = enum {FALSE, TRUE}

Я не уверен, раскрывает ли GDB эту информацию. Он записан в данные DWARF, поэтому вы можете сбросить его, используяdwarfdump или eu-readelf -w. Последний является частью elfutils и производит следующий вывод:

DWARF section [11] '.debug_macro' at offset 0xac:

 Offset:             0x0
 Version:            4
 Flag:               0x2 (debug_line_offset)
 Offset length:      4
 .debug_line offset: 0x0

 #include offset 0x0
 start_file 0, [1] file.c
  start_file 31, [2] /usr/include/stdc-predef.h
   #include offset 0x0
  end_file
  #define FALSE 0, line 1 (indirect)
  #define TRUE 1, line 2 (indirect)
 end_file

При условии, что file.c содержит:

#define FALSE 0
#define TRUE 1

Однако, учитывая вложенную структуру DWARF, это не то, что можно легко обработать такими инструментами, как grep.

Другие вопросы по тегам