Làm cách nào để biết một thư viện đã được biên dịch bằng -g?


103

Tôi có một số thư viện đã biên dịch trên x86 Linux và tôi muốn nhanh chóng xác định xem chúng có được biên dịch với các ký hiệu gỡ lỗi hay không.

Câu trả lời:


85

Nếu bạn đang chạy trên Linux, hãy sử dụng objdump --debugging. Cần có một mục nhập cho mỗi tệp đối tượng trong thư viện. Đối với các tệp đối tượng không có ký hiệu gỡ lỗi, bạn sẽ thấy một cái gì đó như:

objdump --debugging libvoidincr.a
In archive libvoidincr.a:

voidincr.o:     file format elf64-x86-64

Nếu có các ký hiệu gỡ lỗi, đầu ra sẽ dài dòng hơn nhiều.


5
Ngoài ra còn có obdjump -W libreadelf -w lib. Cái sau có thể định cấu hình cao hơn - xem readelf (1) manpage.
przemoc

3
Đối với bất kỳ tệp nhị phân nào, (bao gồm cả những tệp được biên dịch với -g) objdump cho tôi phản hồi là "không có thông tin gỡ lỗi được công nhận" trừ khi tôi biên dịch nó bằng -gstabs. Đây dường như là một lỗi đã được công nhận.
Dan Hook

Dan, bạn đã thử cái này trên nền tảng nào?
swegi

Tiếng Nga được tuyển dụng: từ man objdump (1), cờ --debugging "cố gắng phân tích cú pháp thông tin định dạng gỡ lỗi STABS và IEEE được lưu trữ trong tệp và in nó ra bằng cú pháp giống C. Nếu không tìm thấy cả hai định dạng này, tùy chọn này sẽ lùi trên tùy chọn -W để in bất kỳ thông tin DWARF nào trong tệp. "
Matt McClellan

5
objdump -gkhông mang lại gì cho tôi cho một bài kiểm tra đơn giản. do đó được biên dịch cả có lẫn không g, khiến nó trở nên vô dụng một cách hiệu quả. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -acó vẻ hữu ích hơn.
jw013 20/09/13

89

Lệnh gợi ý

objdump --debugging libinspected.a
objdump --debugging libinspected.so

cho tôi kết quả luôn giống nhau ít nhất là trên Ubuntu / Linaro 4.5.2:

libinspected.a:     file format elf64-x86-64
libinspected.so:     file format elf64-x86-64

cho dù thư viện lưu trữ / chia sẻ được xây dựng có hay không có -gtùy chọn

Điều gì thực sự đã giúp tôi để xác định liệu -gđược sử dụng là readelf công cụ:

readelf --debug-dump=decodedline libinspected.so

hoặc là

readelf --debug-dump=line libinspected.so

Thao tác này sẽ in ra tập hợp các dòng bao gồm tên tệp nguồn, số dòng và địa chỉ nếu thông tin gỡ lỗi đó được đưa vào thư viện , nếu không, nó sẽ không in .

Bạn có thể chuyển bất kỳ giá trị nào bạn thấy cần thiết cho --debug-dumptùy chọn thay vì decodedline.


1
hoạt động hoàn hảo. Tôi đã thử lệnh này trên tệp thực thi của mình với CMAKE_BUILD_TYPE RELEASE đầu tiên và lệnh trả về trống. Sau đó, tôi đã thử với CMAKE_BUILD_TYPE DEBUG và sau đó có khá nhiều đầu ra.
infoclogged

32

Những gì đã giúp là:

gdb mylib.so

Nó sẽ in khi không tìm thấy ký hiệu gỡ lỗi:

Reading symbols from mylib.so...(no debugging symbols found)...done.

Hoặc khi tìm thấy:

Reading symbols from mylib.so...done.

Không có câu trả lời nào trước đó mang lại kết quả có ý nghĩa cho tôi: các lib không có ký hiệu gỡ lỗi đang đưa ra nhiều kết quả, v.v.


Cám ơn! Điều này đã làm việc cho tôi, sử dụng trình biên dịch
clang

siêu tuyệt vời để kiểm tra nhanh chóng! cũng hoạt động trên các tệp đối tượng * .o.
Stephane Rolland

28

nm -a <lib> sẽ in tất cả các ký hiệu từ thư viện, bao gồm cả các ký hiệu gỡ lỗi.

Vì vậy, bạn có thể so sánh kết quả đầu ra của nm <lib>nm -a <lib>- nếu chúng khác nhau, lib của bạn chứa một số ký hiệu gỡ lỗi.


3
@ Người Nga có việc làm Bạn có thể vui lòng nói rõ hơn về điều này được không? Tại sao bạn nghĩ rằng nó là một công cụ sai? Nó thực hiện công việc và cũng làm được trên Linux.
qrdl

Ngay cả đối với Linux nhúng dựa trên kernel 2.6.35, xxx-objdump, xxx-nm hoạt động tốt.
agfe2

nm -acó bí danh nm --debug-symstự giải thích :-).
pevik

3
Chỉ cần nhập diff <(nm <lib>) <(nm -a <lib>)để nhận được sự khác biệt dễ dàng
Aᴄʜᴇʀᴏɴғᴀɪʟ

17

Trên OSX, bạn có thể sử dụng dsymutil -sdwarfdump.

Sử dụng, dsymutil -s <lib_file> | morebạn sẽ thấy các đường dẫn tệp nguồn trong các tệp có ký hiệu gỡ lỗi, nhưng chỉ có tên hàm khác.


11
Ví dụ, bạn có thể cung cấp chi tiết về những gì cần tìm trong kết quả đầu ra dsymutil -skhông? Sự tồn tại của đầu ra có nghĩa là nó đã được xây dựng với các ký hiệu gỡ lỗi, hay nó phải được gắn vào?
Mitch

12

Bạn có thể sử dụng objdump cho việc này.

CHỈNH SỬA: Từ man-page:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.

6

Các câu trả lời đề xuất việc sử dụng objdump --debugginghoặc readelf --debug-dump=...không hoạt động trong trường hợp thông tin gỡ lỗi được lưu trữ trong tệp tách biệt với tệp nhị phân, tức là tệp nhị phân chứa phần liên kết gỡ lỗi . Có lẽ người ta có thể gọi đó là một lỗi trong readelf.

Đoạn mã sau sẽ xử lý điều này một cách chính xác:

# Test whether debug information is available for a given binary
has_debug_info() {
  readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}

Xem Tệp gỡ lỗi riêng biệt trong hướng dẫn sử dụng GDB để biết thêm thông tin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.