2012-10-23 31 views
5

Tôi đang sử dụng gdb và một số thư viện được chia sẻ. Tôi có thể nhận được gdb để bước vào thư viện được chia sẻ của riêng tôi, nhưng không phải là một bên thứ ba.sử dụng gdb để chuyển sang các chức năng của bên thứ ba với các thư viện được chia sẻ

Khi sử dụng gdb, tôi mong muốn "s" (bước) bước vào thư viện của bên thứ ba và hiển thị cho tôi dòng đang thực hiện bên trong các hàm opj_ * này thay vì chỉ đến dòng tiếp theo trong mã thư viện được chia sẻ của riêng tôi .

Tôi khá chắc chắn tôi chỉ thiếu một thứ gì đó trong quá trình biên dịch, phải làm với liên kết (nhận gcc để chuyển một số cờ gỡ lỗi sang ld), nhưng tôi không biết nó là gì, hoặc một cái gì đó khi chạy gdb để cho nó biết các biểu tượng gỡ lỗi ở đâu.

Dưới đây là chi tiết:

tôi có các gói thư viện openjpeg, thông tin gỡ lỗi và devel cài đặt.

# 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 

Tôi có thư viện được chia sẻ libjna_openjpeg được liên kết với libopenjpeg.

Tôi có một chương trình thử nghiệm "pathtest" liên quan đến libopenjpeg và libjna_openjpeg

tôi biên soạn mỗi với "gcc -g ..." và cũng đã cố gắng "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 

Một đoạn mã thư viện được chia sẻ của tôi với một số nhận xét bị xóa:

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); 

chạy 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 

phiên bản gdb

# gdb --version 
GNU gdb (GDB) SUSE (7.3-41.1.2) 
...  
+0

Bạn đã thử sử dụng 'si' (hướng dẫn bước) thay vì' s'? –

+0

si dường như bước vào libopenjpeg, nhưng tôi không nghĩ rằng nó hữu ích vào thời điểm đó ... Tôi cần số dòng, tên biến, hoặc một cái gì đó để giúp tôi hiểu những gì mã đang làm. Vì vậy, tôi nghĩ gdb thiếu thông tin gỡ lỗi ... Tôi muốn biết cách kết nối nó với tệp .so hoặc gdb. Đây là thử nghiệm của tôi với "si": http://pastebin.com/yaCBkZr4 – Peter

Trả lời

1

Bạn đã không cung cấp cho phiên bản gdb của bạn. Rõ ràng đây có thể là một lỗi trong gdb, bởi vì tôi đã có cùng một vấn đề với 7.0.1 nhưng nâng cấp lên 7.3.50 cố định nó.

5

bạn có thể thử bằng cách bật chế độ bước không?

(gdb) set step-mode on 

Điều này làm cho lệnh bước dừng tại lệnh đầu tiên của hàm không chứa thông tin dòng gỡ lỗi (thường là bên thứ 3 như libc) thay vì bước qua nó.

+1

điều này làm việc cho tôi, cảm ơn. – user13107

Các vấn đề liên quan