2012-12-27 28 views
8

Hãy nói rằng tôi có một chương trình như thế nàyLàm thế nào để chuyển đổi một địa chỉ chức năng để một biểu tượng

// print-addresses.cpp 
#include <stdio.h> 

void foo() { } 

void bar() { } 

void moo() { } 

int main(int argc, const char** argv) { 
    printf("%p\n", foo); 
    printf("%p\n", bar); 
    printf("%p\n", moo); 
    return 0; 
} 

It in một số con số như

013510F0 
013510A0 
01351109 

Làm thế nào để chuyển đổi những con số trở thành những biểu tượng đúng ? Hiệu quả Tôi muốn để có thể làm được điều này

print-addresses > address.txt 
addresses-to-symbols < address.txt 

Và có nó in

foo 
bar 
moo 

Tôi biết điều này có cái gì để làm với các Debug Interface Access SDK nhưng nó không hoàn toàn rõ ràng với tôi như thế nào tôi đi từ một địa chỉ cho một biểu tượng.

Trả lời

8

Điều này có vẻ giống như chính xác những gì bạn đang tìm kiếm: Retrieving Symbol Information by Address. Điều này sử dụng DbgHelp.dll và dựa vào việc gọi SymFromAddr. Bạn phải làm điều đó (tôi nghĩ) từ bên trong ứng dụng đang chạy, hoặc bằng cách đọc trong một tệp minidump.

Bạn cũng có thể sử dụng DIA, nhưng chuỗi cuộc gọi phức tạp hơn một chút. Hãy gọi IDiaDataSource::loadDataForExeIDiaDataSource::openSession để nhận số IDiaSession, sau đó IDiaSession::getSymbolsByAddr để nhận IDiaEnumSymbolsByAddr. Sau đó, IDiaEnumSymbolsByAddr::symbolByAddr sẽ cho phép bạn tra cứu một biểu tượng theo địa chỉ. Ngoài ra còn có một cách (được hiển thị trong ví dụ ở liên kết cuối cùng) để liệt kê tất cả các ký hiệu.

EDIT: Ứng dụng mẫu DIA này có thể là điểm khởi đầu tốt để sử dụng DIA: http://msdn.microsoft.com/en-us/library/hd8h6f46%28v=vs.71%29.aspx. Đặc biệt kiểm tra các bộ phận bằng cách sử dụng IDiaEnumSymbolsByAddr.

Bạn cũng có thể phân tích đầu ra của dumpbin, có thể với/SYMBOLS hoặc/DISASM tùy chọn.

+0

như xa như tôi có thể nói không ai trong số những giải pháp thực sự trả lời câu hỏi. Tôi tình cờ biết rằng dữ liệu trong dumpbin là không đủ. Câu trả lời đầu tiên của bạn yêu cầu phải được chạy trong chương trình gốc. Câu trả lời ở giữa có thể hiệu quả nhưng không rõ. – gman

+0

@gman: Tôi xin lỗi, bạn có thể cho tôi biết điều gì không rõ ràng về câu trả lời giữa không? Câu trả lời đầu tiên * làm * hoạt động từ bên ngoài chương trình, bạn chỉ cần tạo một tệp minidump và tải nó. –

1

nếu bạn đang ở trong Linux, bạn có thể thử addr2line

addr2line addr -e execuablebin -f 
Các vấn đề liên quan