2012-07-19 29 views
13

Tôi cần lấy thông tin được cung cấp bởi addr2line (tệp và dòng từ backtracing một cuộc gọi hàm) từ bên trong chương trình C++. Có một cuộc gọi thư viện tương tự như addr2line không?Có cuộc gọi thư viện nào tới addr2line không?

chỉnh sửa: Tôi đang làm việc trong môi trường Linux.

Tôi biết tôi có thể gọi trực tiếp addr2line và tôi biết rằng tôi có thể sử dụng source code của addr2line trong chương trình của mình (cũng được cấp phép GPL). Nhưng tôi đoán gọi một chức năng thư viện, nếu nó tồn tại, là sạch hơn.

chỉnh sửa: Tôi sẽ sử dụng bfd của các binutils, giống như addr2line. Bfd có nghĩa là gì?

+0

libdwarf là ​​nội dung bạn đang tìm kiếm –

+0

Cảm ơn bạn đã đề xuất. Tôi đã thử dwarfdump và nó chỉ in nơi các hàm được khai báo, không phải nơi chúng được gọi. Tôi không thể tìm thấy một tài liệu phong nha mặc dù ... – steffen

+2

'bfd' là http://en.wikipedia.org/wiki/Binary_File_Descriptor_library (mặc dù ban đầu nó đứng cho ý nghĩa khác của BFD :) – ecatmur

Trả lời

6

Bạn có thể thử chức năng dladdr(). Nó sử dụng các ký hiệu động của chương trình, không phải là thông tin gỡ lỗi (biên dịch chương trình với gcc -rdynamic).

Ngoài ra, bạn có thể kiểm tra thư viện backtrace hoặc thư viện cấp cao hơn stacktrace.
Không chính xác những gì bạn đang yêu cầu, nhưng chúng có thể hữu ích.

+1

Cảm ơn bạn đã gửi các mã quảng cáo. Với 'dladdr()' tôi chỉ nhận được thông tin cho mã được liên kết động và chỉ có tên tệp, chứ không phải dòng, nếu tôi hiểu quyền manpage. Tôi đã sử dụng backtrace để lấy địa chỉ. Những gì tôi cần bây giờ là một cái gì đó để có được các tập tin và dòng ra khỏi địa chỉ. stacktrace là một trình bao bọc cho backtrace. – steffen

+0

Ngoài ra, còn có thư viện 'libunwind': http://www.nongnu.org/libunwind/ –

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