Не удалось загрузить символы отладки из внешнего файла при отладке с помощью GDB

Я изучаю, как использовать GDB для отладки символов во внешнем файле. Я создаю небольшой исполняемый файл, который зависит от og и столь же небольшой общей библиотеки. Я собираю исполняемый файл с помощью cmake, создавая следующую команду g++ (для простоты я опустил различные включения):

g++ -DSharedLib_EXPORTS -m64 -Wall -O0 -g -ggdb -std=c++17 -fPIC -MD -MT SharedLib/CMakeFiles/SharedLib.dir/src/SharedLib.cpp.o -MF CMakeFiles/SharedLib.dir/src/SharedLib.cpp.o.d -o CMakeFiles/SharedLib.dir/src/SharedLib.cpp.o -c SharedLib/src/SharedLib.cpp
g++ -m64 -Wall -O0 -g -ggdb -std=c++17 -fPIE -MD -MT Executable/CMakeFiles/Executable.dir/src/Executable.cpp.o -MF CMakeFiles/Executable.dir/src/Executable.cpp.o.d -o CMakeFiles/Executable.dir/src/Executable.cpp.o -c Executable/src/Executable.cpp
g++ -fPIC -m64 -Wall -O0 -g -ggdb -m64 -shared -Wl,-soname,libSharedLib.so -o libSharedLib.so CMakeFiles/SharedLib.dir/src/SharedLib.cpp.o -ldl -lrt -lpthread
g++ -m64 -Wall -O0 -g -ggdb -m64 CMakeFiles/Executable.dir/src/Executable.cpp.o -o Executable libSharedLib.so -lrt -ldl -lpthread

Затем я копирую/удаляю символы как из общей библиотеки, так и из исполняемого файла с помощью:

objcopy --only-keep-debug Executable symbols/Executable.debug
objcopy --add-gnu-debuglink=symbols/Executable.debug Executable
strip Executable

Проверка удаленного исполняемого файла с помощью readelf --string-dump=.gnu_debuglink Executable показывает, что в файле действительно есть ссылка для отладки:

String dump of section '.gnu_debuglink':
  [     0]  Executable.debug
  [    14]  ^�$�

В результате в каталоге символов я получаю два файла .debug: один для исполняемого файла, а другой для общей библиотеки.

Затем я запускаю gdb для отладки исполняемого файла (я намеренно добавил ошибку сегментации в общую библиотеку, чтобы протестировать ее с помощью gdb):

(gdb) set debug-file-directory symbols
(gdb) file Executable
Reading symbols from Executable...
(No debugging symbols found in Executable)
(gdb)

Такое ощущение, что он полностью игнорирует set debug-file-directory symbols? Что я делаю не так?

С уважением Клаус

См. Отдельные файлы отладки , к debug-file-directory добавляется абсолютный путь к исполняемому файлу, а не только само имя исполняемого файла. Вместо этого вы можете попробовать add-symbol-file.

ssbssa 09.06.2024 16:59

@ssbssa большое спасибо. Оно работает! Я уже безуспешно пробовал использовать каталог «.debug», но, должно быть, сделал что-то не так, потому что теперь это тоже работает!

Klaus Holst Jacobsen 09.06.2024 19:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как сказал @ssbssa в комментарии, поиск разделенных файлов отладки в GDB не делает то, что вы думаете.

Во-первых, когда вы это делаете:

objcopy --add-gnu-debuglink=symbols/Executable.debug Executable

Бит symbols/ отбрасывается, это подтверждает ваш дамп раздела отладочной ссылки.

Поэтому GDB будет искать файл, указанный в разделе ссылки отладки:

  1. В том же каталоге, что и исполняемый файл,
  2. В подкаталоге .debug/, а затем
  3. В любых debug-каталогах, но по пути к исполняемому файлу.

Итак, если ваш исполняемый файл — /opt/bin/Executable, ссылка отладки — Executable.debug, а debug-file-directories/symbols, GDB будет искать:

  1. /opt/bin/Executable.debug
  2. /opt/bin/.debug/Executable.debug
  3. /symbols/opt/bin/Executable.debug

Вы можете получить больше информации о том, куда смотрит GDB, включив флаг отладки сопровождающего GDB:

(gdb) set debug separate-debug-file on

Затем запустите команду file, и GDB напечатает место, где он ищет отладочную информацию.

Одна вещь, которая меня обманула, это то, что если в мои исполняемые файлы/библиотеки встроен rpath, то даже если я запускаю gdb с LD_LIBRARY_PATH=/alternate/lib/location, он фактически загружает исходную библиотеку в rpath (если она существует), таким образом ищу файлы символов где-то в другом месте, чем я ожидал!

Klaus Holst Jacobsen 09.06.2024 19:30

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