Я вижу странную проблему при попытке использовать gdb для отладки тестовой программы для пакета, созданного с помощью libtool. Если я запускаю libtool --mode=execute gdb .libs/libfoo.so
и прошу указать источник какой-либо функции list Bar::Baz
, я получаю исходный код, как и ожидалось. Если я запускаю libtool --mode=execute gdb binary
, я могу взломать Bar::Baz()
и увидеть его аргументы в трассировке стека, но я не получаю исходный файл или номера строк, например:
#7 0x018348e5 in Bar::Baz(Qux*, Quux*) () from /path/to/libfoo.so
^^^^^^^^^^^ <--- debug symbols are present!
Аналогичным образом, если я пытаюсь list Bar::Baz
при отладке исполняемого файла, я получаю
No line number known for 'Bar::Baz'.
Я подтвердил, что двоичный файл связан с -g
, и я могу перечислить его функцию main
, поэтому я знаю, что присутствует некоторая отладочная информация.
Когда я говорю info sources
, я получаю полный список файлов, из которых построена библиотека, с правильными абсолютными путями. Когда я говорю info shared
, я получаю правильный путь в списке к объектному файлу с Yes
в столбце Syms
.
Есть еще идеи, что может пойти не так и как это исправить?
Редактировать 1: Я случайно запустил objdump -g
в библиотеке, которая нарушает работу, и получил следующий вывод:
/path/to/foo.so.0.0.0: file format elf32-i386
objdump: /path/to/foo.so.0.0.0: no recognized debugging information
Это удивительно, поскольку objdump -h
(что я пытался запустить) перечисляет кучу .debug_*
разделов. Руководство objdump
также предлагает readelf -w
, и это, кажется, печатает огромную кучу информации. Мне нужно посмотреть, что он на самом деле дает.
Редактировать 2: Итак, readelf -w
дал некоторое просветление. По какой-то причине файл общего объекта не содержит отладочной информации из подавляющего большинства любых объектов, связанных с ним. Основываясь на файлах Makefile, возможно, что команда, которая фактически собирает объекты в разделяемую библиотеку, не передается -g
, и поэтому информация не распространяется должным образом. Самое смешное, что это работает (имеет полную отладочную информацию) на всех других наших конфигурациях, включая ту же версию компилятора на x86_64 (по сравнению с нынешним x86).
Редактировать 3: На самом деле прошла полная перестройка с измененным Makefile с добавлением -g в LDFLAGS, и это не имело никакого значения. Теперь я хорошо и по-настоящему сбит с толку.