2009-07-09 20 views

Trả lời

21

Có một New Kids on the Block - pyelftools - một thư viện Python tinh khiết để phân tích các định dạng ELF và lùn. Hãy thử một lần.

Nó nhằm mục đích có tính năng hoàn chỉnh và hiện đang trong phát triển tích cực, vì vậy bất kỳ vấn đề cần được xử lý một cách nhanh chóng và nhiệt tình :-)

10

Khái niệm "thông tin gỡ lỗi ELF" không thực sự tồn tại: đặc tả ELF để lại nội dung của phần .debug cố tình không xác định.

Các định dạng gỡ lỗi phổ biến là STAB và DWARF. Thư viện để đọc DWARF là libdwarf.

+0

Có, khá đúng. DWARF là những gì tôi quan tâm. –

+1

Tôi đã cập nhật câu hỏi cho phù hợp. –

+1

Là nền tảng đa nền tảng libdwarf, bạn có biết không? Trang này không nói, nhưng dường như có một hương vị tổng thể của Unix cho nó. –

5

Bạn có thể tìm thấy thông tin hữu ích ở đây:

+0

Cảm ơn, tôi đã bỏ lỡ câu hỏi SO khác, tôi đoán vì tôi không tìm kiếm "DWARF". Tôi sẽ cập nhật tiêu đề của câu hỏi này. –

4

lựa chọn của bạn cho việc đọc các thông tin gỡ lỗi lùn là không may khá hạn chế.

Theo tôi biết chỉ có một thư viện mục đích chung để phân tích cú pháp thông tin gỡ lỗi DWARF và đó là libdwarf. Rất tiếc, không ai có thể viết các ràng buộc Python cho libdwarf (có thể bạn tự mình dùng nó và chia sẻ nó với mọi người khác :)) Bạn chắc chắn có thể truy cập các chức năng của thư viện bằng cách sử dụng ctypes hoặc Python C API.

Một giải pháp ít thanh lịch hơn, tuy nhiên, là sử dụng trình phân tích cú pháp DWARF hiện có và phân tích cú pháp thông tin văn bản mà nó xuất ra. Các tùy chọn của bạn cho điều này (trên Linux) là

objdump -W 
readelf --debug-dump=[OPTIONS] 

Tôi hiện đang sử dụng một dự án tự xây dựng và hỗ trợ thông tin gỡ lỗi DWARF rất đầy đủ tính năng. Bạn có thể chỉ cần sử dụng Python để thực thi lệnh trong shell và sau đó phân tích cú pháp thông tin mà bạn cần. Chắc chắn không phải là lý tưởng như một thư viện, nhưng nên làm các trick.

EDIT: Tôi nhận thấy trong một nhận xét trước đó bạn đã đề cập đến Windows. Cả hai chương trình này (objdump và readelf) là một phần của GNU-binutils, vì vậy chúng nên có sẵn với Cygwin hoặc mingw.

+0

cũng có 'dwarfdump'. – hochl

7

Bạn có thể quan tâm đến các thư viện lùn từ pydevtools:

>>> from devtools.dwarf import DWARF 
>>> dwarf = DWARF('test/test') 
>>> dwarf.get_loc_by_addr(0x8048475) 
('/home/emilmont/Workspace/dbg/test/main.c', 36, 0) 
>>> print dwarf 
.debug_info 
COMPILE_UNIT<header overall offset = 0> 
<0><11> compile_unit 
producer: GNU C 4.4.3 
language: C89 
name: a/test.c 
comp_dir: /home/emilmont/Workspace/dbg/test 
low_pc: 0x080483e4 
high_pc: 0x08048410 
stmt_list: 0 
[...] 
+0

Thật tuyệt vời khi biết. Vài câu hỏi: 1) Nền tảng nào được hỗ trợ (Windows, Linux)? 2) Bạn có thể đặt nó trên [PyPI] (http://pypi.python.org/pypi) không? –

+0

Đó là trên PyPI: http://pypi.python.org/pypi/BinTools/0.1.0 – emilmont

+0

Tuyệt vời! Tài liệu không đề cập đến các nền tảng được hỗ trợ. Nó có hoạt động trên Windows không? –

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