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.
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à. –
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 đề. –
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. –