Использование GDB для перехода к сторонним функциям с общими библиотеками
Я использую GDB и некоторые общие библиотеки. Я могу заставить GDB войти в мою собственную разделяемую библиотеку, но не в стороннюю.
При использовании gdb я ожидаю, что "s" (шаг) войдет в стороннюю библиотеку и покажет мне строки, которые он выполняет внутри этих функций opj_*, вместо того, чтобы просто перейти к следующей строке в моем собственном коде общей библиотеки.
Я почти уверен, что что-то упускаю во время компиляции, связанное с компоновкой (получение gcc для передачи некоторых флагов отладки в ld), но я не знаю, что это такое, или что-то такое, когда gdb указывает, где символы отладки
Вот подробности:
У меня есть библиотека openjpeg, отладочная информация и пакеты devel.
# zypper search -si openjpeg
Loading repository data...
Reading installed packages...
S | Name | Type | Version | Arch | Repository
--+--------------------------+---------+-----------+--------+-----------
i | libopenjpeg2_0 | package | 2.0.0-1.4 | x86_64 | packman
i | libopenjpeg2_0-debuginfo | package | 2.0.0-1.4 | x86_64 | packman
i | openjpeg2-devel | package | 2.0.0-1.4 | x86_64 | packman
# rpm -ql libopenjpeg2_0
/usr/lib64/libopenjpeg.so.2.0
/usr/lib64/libopenjpeg.so.2.0.0
# rpm -ql openjpeg2-devel
/usr/include/openjpeg-2.0
/usr/include/openjpeg-2.0/openjpeg.h
/usr/lib64/libopenjpeg.so
/usr/lib64/openjpeg-2.0
/usr/lib64/openjpeg-2.0/OpenJPEGConfig.cmake
/usr/lib64/openjpeg-2.0/OpenJPEGTargets-release.cmake
/usr/lib64/openjpeg-2.0/OpenJPEGTargets.cmake
# rpm -ql libopenjpeg2_0-debuginfo
/usr/lib/debug
/usr/lib/debug/.build-id
/usr/lib/debug/.build-id/85/f8603c75aadee0bd66653332d7ce16d0292752
/usr/lib/debug/.build-id/85/f8603c75aadee0bd66653332d7ce16d0292752.debug
/usr/lib/debug/usr/lib64/libopenjpeg.so.2.0.0.debug
У меня есть общая библиотека libjna_openjpeg, связанная с libopenjpeg.
У меня есть тестовая программа "pathtest", связанная с libopenjpeg и libjna_openjpeg
Я скомпилировал каждый с помощью "gcc -g...", а также попробовал "gcc -ggdb..."
gcc -ggdb -c -fpic -I/usr/include/openjpeg-2.0 jna_openjpeg.c -lopenjpeg
gcc -ggdb -shared -o libjna_openjpeg.so jna_openjpeg.o -lopenjpeg
gcc -ggdb -I/usr/include/openjpeg-2.0 -L. -o pathtest pathtest.c -ljna_openjpeg -lopenjpeg
Фрагмент кода моей общей библиотеки с удаленными комментариями:
opj_stream_t* p_stream = opj_stream_create_default_file_stream( p_file, p_is_read_stream );
opj_codec_t *p_decompressor = opj_create_decompress(CODEC_J2K);
// my bug I want to debug is here... this always returns 0
p_image = opj_decode( p_decompressor, p_stream );
работает GDB
$ gdp pathtest
...
(gdb) s
52 opj_codec_t *p_decompressor = opj_create_decompress(CODEC_J2K);
(gdb) s
59 p_image = opj_decode( p_decompressor, p_stream );
(gdb) s
версия GDB
# gdb --version
GNU gdb (GDB) SUSE (7.3-41.1.2)
...
2 ответа
Вы можете попробовать, включив пошаговый режим?
(gdb) set step-mode on
Это приводит к тому, что команда шага останавливается на первой инструкции функции, которая не содержит информации о строке отладки (обычно сторонней, например, libc), а не переходит ее.
Вы не дали свою версию GDB. Очевидно, это могло быть ошибкой в gdb, потому что у меня была та же проблема с 7.0.1, но при обновлении до 7.3.50 ее исправили.