Использование 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 ее исправили.

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