2012-04-03 42 views
47

Phiên bản ngắn của câu hỏi: Làm cách nào để gdb sử dụng các biểu tượng gỡ lỗi cho libc?Cách sử dụng phiên bản gỡ lỗi của libc

Phiên bản dài hơn: Tôi đang gỡ lỗi chương trình bằng gdb và tôi muốn xem thông tin về futex được sử dụng bởi libc. Tuy nhiên, tại một số điểm trong gỡ lỗi tôi nhận được đầu ra như:

Catchpoint 2 (call to syscall futex), 0x00007ffff772b73e in ??() from /lib/libc.so.6 
(gdb) bt 
#0 0x00007ffff772b73e in ??() from /lib/libc.so.6 
#1 0x00007ffff767fb90 in ??() from /lib/libc.so.6 
#2 0x00007ffff767a4c0 in vfprintf() from /lib/libc.so.6 
#3 0x00007ffff768565a in printf() from /lib/libc.so.6 
.... 

Khi tôi chạy info sharedlibrary trong gdb tại breakpoint tôi thấy:

(gdb) info sharedlibrary 
From    To     Syms Read Shared Object Library 
0x00007ffff7dddaf0 0x00007ffff7df6704 Yes (*)  /lib64/ld-linux-x86-64.so.2 
0x00007ffff7bc53e0 0x00007ffff7bd1388 Yes (*)  /lib/libpthread.so.0 
0x00007ffff79ba190 0x00007ffff79bd7d8 Yes (*)  /lib/librt.so.1 
0x00007ffff76538c0 0x00007ffff7766c60 Yes (*)  /lib/libc.so.6 
0x00007ffff6c1fd80 0x00007ffff6c303c8 Yes (*)  /lib/libgcc_s.so.1 
(*): Shared library is missing debugging information. 

Và khi tôi chạy ldd tôi thấy:

linux-vdso.so.1 => (0x00007ffff7fde000) 
libpthread.so.0 => /lib/libpthread.so.0 (0x00007ffff7dbf000) 
librt.so.1 => /lib/librt.so.1 (0x00007ffff7bb6000) 
libc.so.6 => /lib/libc.so.6 (0x00007ffff7833000) 
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fdf000) 

Tôi đang sử dụng Ubuntu 10.04 và tôi nghĩ rằng phiên bản libc có biểu tượng gỡ lỗi nằm trong /usr/lib/debug/lib. Tôi đã thử đặt biến số LD_LIBRARY_PATH của mình để có điều này ở phía trước của đường dẫn nhưng điều đó dường như không tạo nên sự khác biệt.

Tôi không hoàn toàn rõ ràng về cách chương trình chọn thư viện được chia sẻ để tải, cho dù điều này được đặt vào thời gian chạy hoặc biên dịch (tôi loại thời gian chạy giả định nhưng bây giờ tôi không chắc chắn). Vì vậy, thông tin về cách lấy gdb để sử dụng phiên bản gỡ lỗi của libc được đánh giá cao.

Trả lời

57

Tôi nghĩ rằng phiên bản libc có biểu tượng gỡ lỗi nằm trong/usr/lib/debug/lib. Tôi đã thử thiết lập biến LD_LIBRARY_PATH của tôi để có điều này ở phía trước của con đường nhưng điều đó dường như không tạo ra sự khác biệt.

Đây là không phải các droid bạn đang tìm kiếm.

Thư viện trong/usr/lib/debug không phải là thư viện thực sự. Thay vào đó, chỉ chứa chỉ thông tin gỡ lỗi, nhưng không chứa các phần .text cũng không .data của libc.so.6 thực. Bạn có thể đọc về các tệp gỡ lỗi riêng lẻ here.

Các tập tin trong /usr/lib/debug đến từ libc6-dbg gói, và GDB sẽ tải chúng tự động, miễn là chúng phù hợp cài đặt phiên bản libc6 của bạn. Nếu libc6libc6-dbg của bạn không khớp, bạn sẽ nhận được cảnh báo từ GDB.

Bạn có thể quan sát các tệp mà GDB đang cố gắng đọc bằng cách đặt set verbose on. Dưới đây là những gì bạn sẽ thấy khi libc6libc6-dbg làm trận đấu:

(gdb) set verbose on 
(gdb) run 
thread_db_load_search returning 0 
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/lib/ld-2.11.1.so...done. 
thread_db_load_search returning 0 
done. 
thread_db_load_search returning 0 
Loaded symbols for /lib64/ld-linux-x86-64.so.2 
Reading symbols from system-supplied DSO at 0x7ffff7ffb000...done. 
WARNING: no debugging symbols found in system-supplied DSO at 0x7ffff7ffb000. 
thread_db_load_search returning 0 
Reading in symbols for dl-debug.c...done. 
Reading in symbols for rtld.c...done. 
Reading symbols from /lib/librt.so.1...Reading symbols from /usr/lib/debug/lib/librt-2.11.1.so...done. 
thread_db_load_search returning 0 
... etc ... 

Cập nhật:

Ví dụ tôi thấy
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done

Đó ngụ ý rằng GDB của bạn không tìm kiếm /usr/lib/debug . Một cách có thể xảy ra là nếu bạn đặt debug-file-directory trong số .gdbinit không chính xác của mình.

Đây là thiết lập mặc định:

(gdb) show debug-file-directory 
The directory where separate debug symbols are searched for is "/usr/lib/debug". 
+0

cảm ơn câu trả lời cho câu hỏi của tôi. Dường như tôi có một số vấn đề khác bởi vì khi tôi bật đầu ra tiết, tôi không thấy gdb tìm kiếm '/ usr/lib/debug' cho các biểu tượng cho libc. Ví dụ tôi thấy 'Đọc các biểu tượng từ /lib/libc.so.6... (không tìm thấy các biểu tượng gỡ lỗi) ... xong .' Vì vậy, tôi vẫn gặp một số vấn đề, nhưng câu trả lời của bạn rất hữu ích để hiểu vấn đề thực sự là. –

+3

cảm ơn bạn đã cập nhật. Tôi đã tải xuống và cài đặt gdb 7,4 từ nguồn trong thư mục chính của tôi vì nó đã sửa lỗi giải quyết vấn đề tôi gặp phải với gdb 7.1, nhưng tôi không có quyền cập nhật phiên bản gdb trên hệ thống của mình. Dù sao, 'debug-files-directory' không được thiết lập đúng nhưng thiết lập nó đúng trong' .gdbinit' có vẻ như đã khắc phục được vấn đề. –

+0

Ngoài ra, để bước vào các hàm libc trong gdb, hãy chắc chắn tải xuống mã nguồn glibc và giải nén nó. Sau đó chạy lệnh gdb 'directory' với đường dẫn đến nguồn. Nếu bạn đang chạy bản phân phối vá lỗi libc (chẳng hạn như Debian), thì hãy chắc chắn áp dụng cùng một bản vá (chẳng hạn như bằng cách chạy 'debuild'), nếu không thì các số dòng nguồn có thể không khớp. –

13

Hãy chắc chắn rằng bạn đã cài đặt những biểu tượng gỡ lỗi cho libc:

sudo apt-get install libc6-dbg 

Và nếu bạn đang ở trên một x64 hệ thống gỡ lỗi mã x86:

sudo apt-get install libc6:i386 
sudo apt-get install libc6-dbg:i386 
Các vấn đề liên quan