2012-12-27 43 views
8

चलो कहते हैं कि मैं इसकैसे एक प्रतीक करने के लिए एक समारोह का पता परिवर्तित करने के लिए

// 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; 
} 

की तरह एक कार्यक्रम है लेट इट

013510F0 
013510A0 
01351109 

जैसे कुछ संख्या प्रिंट मैं कैसे सही प्रतीकों में वापस उन संख्याओं को परिवर्तित ? प्रभावी रूप से मैं इस

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

ऐसा करने में सक्षम होना चाहते हैं और यह प्रिंट

foo 
bar 
moo 

मैं जानता हूँ कि इस Debug Interface Access SDK के साथ कुछ है, लेकिन यह कैसे मैं से जाना मेरे लिए पूरी तरह से स्पष्ट नहीं है चाहता हूँ एक प्रतीक के लिए एक पता।

उत्तर

8

ऐसा लगता है कि आप जो खोज रहे हैं: Retrieving Symbol Information by Address। यह DbgHelp.dll का उपयोग करता है और SymFromAddr पर कॉल करने पर निर्भर करता है। आपको चल रहे एप्लिकेशन के भीतर, या एक मिनीडम्प फ़ाइल में पढ़ने से (मुझे लगता है) ऐसा करना है।

आप डीआईए का भी उपयोग कर सकते हैं, लेकिन कॉलिंग अनुक्रम थोड़ा और जटिल है। प्राप्त करने के लिए, IDiaSession::getSymbolsByAddr प्राप्त करने के लिए IDiaDataSource::loadDataForExe और IDiaDataSource::openSession पर कॉल करें। फिर, IDiaEnumSymbolsByAddr::symbolByAddr आपको पते से एक प्रतीक देखने देगा। सभी प्रतीकों का आकलन करने के लिए एक तरीका भी है (अंतिम लिंक पर उदाहरण में दिखाया गया है)।

संपादित करें: यह डीआईए नमूना आवेदन DIA: http://msdn.microsoft.com/en-us/library/hd8h6f46%28v=vs.71%29.aspx का उपयोग करने के लिए एक अच्छा प्रारंभिक बिंदु हो सकता है। IDiaEnumSymbolsByAddr का उपयोग करके भागों को विशेष रूप से देखें।

आप शायद dumpbin के आउटपुट को भी पार्स कर सकते हैं, शायद/SYMBOLS या/DISASM विकल्प के साथ।

+0

जहाँ तक की कोशिश कर सकते के रूप में मैं इन समाधान में से कोई भी बता सकता है वास्तव में इस सवाल का जवाब। मुझे पता है कि डंपबिन में डेटा पर्याप्त नहीं है। आपके पहले उत्तर को मूल कार्यक्रम में चलाने की आवश्यकता है। मध्य जवाब काम कर सकता है लेकिन यह स्पष्ट नहीं है। – gman

+0

@gman: मुझे खेद है, क्या आप मुझे बता सकते हैं कि मध्य उत्तर के बारे में क्या स्पष्ट नहीं है? पहला जवाब * करता है * प्रोग्राम के बाहर से काम करता है, आपको बस एक मिनीडम्प फ़ाइल उत्पन्न करने और इसे लोड करने की आवश्यकता होती है। –

1

यदि आप लिनक्स में हैं, तो आप addr2line

addr2line addr -e execuablebin -f