我正在使用 gdb 和一些共享库。我可以让 gdb 进入我自己的共享库,但不能进入第 3 方。
使用 gdb 时,我希望“s”(步骤)进入 3rd 方库并向我显示它在这些 opj_* 函数中执行的行,而不是只进入我自己的共享库代码中的下一行。
我很确定我只是在编译过程中遗漏了一些东西,与链接有关(让 gcc 将一些调试标志传递给 ld),但我不知道它是什么,或者在运行 gdb 时告诉它在哪里调试符号是。
以下是详细信息:
我安装了 openjpeg 库、调试信息和开发包。
# 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
我有一个链接到 libopenjpeg 的共享库 libjna_openjpeg。
我有一个链接到 libopenjpeg 和 libjna_openjpeg 的测试程序“pathtest”
我用“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)
...