Я изучаю, как использовать 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?
Что я делаю не так?
С уважением Клаус
@ssbssa большое спасибо. Оно работает! Я уже безуспешно пробовал использовать каталог «.debug», но, должно быть, сделал что-то не так, потому что теперь это тоже работает!





Как сказал @ssbssa в комментарии, поиск разделенных файлов отладки в GDB не делает то, что вы думаете.
Во-первых, когда вы это делаете:
objcopy --add-gnu-debuglink=symbols/Executable.debug Executable
Бит symbols/ отбрасывается, это подтверждает ваш дамп раздела отладочной ссылки.
Поэтому GDB будет искать файл, указанный в разделе ссылки отладки:
.debug/, а затемИтак, если ваш исполняемый файл — /opt/bin/Executable, ссылка отладки — Executable.debug, а debug-file-directories — /symbols, GDB будет искать:
/opt/bin/Executable.debug/opt/bin/.debug/Executable.debug/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 (если она существует), таким образом ищу файлы символов где-то в другом месте, чем я ожидал!
См. Отдельные файлы отладки , к
debug-file-directoryдобавляется абсолютный путь к исполняемому файлу, а не только само имя исполняемого файла. Вместо этого вы можете попробовать add-symbol-file.