Я вижу странную проблему при попытке использовать 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, и это не имело никакого значения. Теперь я хорошо и действительно сбит с толку.