簡體   English   中英

使用gdb通過共享庫進入第三方功能

[英]using gdb to step into 3rd party functions with shared libraries

我正在使用gdb和一些共享庫。 我可以讓gdb進入我自己的共享庫,但不是第三方庫。

當使用gdb時,我希望“s”(步驟)進入第三方庫並向我展示它在這些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。

我有一個測試程序“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)
...    

你能嘗試啟用步進模式嗎?

(gdb) set step-mode on

這導致step命令停止在函數的第一條指令處,該函數不包含調試行信息(通常是第三方,如libc),而不是單步調試它。

你沒有給你的gdb版本。 顯然這可能是gdb中的一個錯誤,因為我遇到了與7.0.1相同的問題但升級到7.3.50修復了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM