2011-12-17 10 views
23

मैं जो इस तरह दिखता है एक छीन एप्लिकेशन द्वारा बनाया गया एक स्टैक ट्रेस करने के लिए पतों कन्वर्ट करने के लिए:gdb का उपयोग लाइनों

*** Check failure stack trace: *** 
    @  0x7f0e442d392d (unknown) 
    @  0x7f0e442d7b1f (unknown) 
    @  0x7f0e442d7067 (unknown) 
    @  0x7f0e442d801d (unknown) 
    @  0x7f0e457c55e6 (unknown) 
    @  0x7f0e457c5696 (unknown) 
    @   0x4e8765 (unknown) 
    @   0x4a8b43 (unknown) 
    @  0x7f0e43197ced (unknown) 
    @   0x4a6889 (unknown) 

और मैं निष्पादन की एक गैर छीन और उसके संस्करण पुस्तकालयों के सभी (संकलित डीबग जानकारी के साथ)। लेकिन मैं पते को फाइलों और रेखा संख्याओं में कैसे अनुवाद कर सकता हूं ??

यहाँ मैं क्या करने की कोशिश की है:

gdb 
set solib-absolute-prefix /path/to/non-stripped/edition/of/root/filesystem/sysroot/ 
file /path/to/non-stripped/edition/of/root/filesystem/sysroot/usr/bin/my-buggy-app 
info line *0x7f0e457c5696 

जब मैं फ़ाइल आदेश में टाइप यह केवल फ़ाइल, नहीं सभी पुस्तकालयों जो उपयोग किया जाता है से प्रतीकों लोड करता है। क्या ऐसा कोई तरीका है?

"जानकारी लाइन" कमांड का कहना है:

कोई पंक्ति संख्या जानकारी पते के लिए उपलब्ध 0x7f0e442d801d पता साझा पुस्तकालयों में से एक है, क्योंकि

कौन सा मैं मानता है, लेकिन कैसे कर सकते हैं मुझे पता है कि उनमें से कौन सा?

+3

['addr2line'] (http://linuxcommand.org/man_pages/addr2line1.html)? –

+0

@ another.anon.coward वर्ष, मैंने कोशिश की लेकिन मुझे नहीं पता कि कौन सी फाइल को देखना है, क्योंकि पते साझा पुस्तकालयों को इंगित कर रहे हैं। – Allan

+0

@ एलन: आप 'info sharedlibrary' कमांड का उपयोग यह जानने के लिए कर सकते हैं कि कौन सी साझा लाइब्रेरी पते' 0x7f0e442d801d' से संबंधित है। – ks1322

उत्तर

25

लेकिन मैं पते को फ़ाइलों और रेखा संख्याओं में कैसे अनुवाद कर सकता हूं?

मुख्य निष्पादन योग्य (0x4e8765 तरह पते) के लिए ऐसा करते हैं:

addr2line -e /path/to/non-stripped/.../my-buggy-app \ 
    0x4a6889 0x4a8b43 0x4e8765 

वास्तव में, यदि आप उपरोक्त सभी पते से 5 (CALL शिक्षा का सामान्य लंबाई) घटाना चाहते हो सकता है।

साझा पुस्तकालयों में पते के लिए, आपको पुस्तकालय के लोड पते को जानना होगा।

यदि आपके एप्लिकेशन ने core फ़ाइल बनाई है, तो (gdb) info shared आपको बताएगा कि पुस्तकालयों को लोड किया गया था।

आप एक कोर फ़ाइल नहीं मिला, और आवेदन फिर आवश्यक मानचित्रण मुद्रित नहीं किया था,

  • तो यह है कि जानकारी प्रिंट है कि आप आवेदन ठीक करना चाहिए, तो (स्टैक ट्रेस ज्यादातर इसके बिना बेकार है), और
  • आप अभी भी अनुमान लगा सकते हैं: निष्पादन योग्य में कोड को 0x4e8760 पर देखें - यह कुछ फ़ंक्शन के लिए CALL निर्देश होना चाहिए। अब पता लगाएं कि कौन सी लाइब्रेरी फ़ंक्शन में है, और लाइब्रेरी में अपना पता ढूंढें (nm के माध्यम से)। यदि आप भाग्यशाली हैं, तो वह पता 0xNc56NN के पास है। अब आप अनुमान लगा सकते हैं कि लाइब्रेरी का लोड पता 0x7f0e457NNNNNN पर है। 0x7f0e457c55e1 के लिए दोहराएं, और आप लाइब्रेरी का लोड पता 0x7f0e442dNNNN पर देख सकते हैं।
17

ओपी के अनुसार, GDB में आदेश एक पते से कोड के स्रोत लाइन को मिल रहा है:

info line *0x10045740 

संपादित: बदला "जानकारी प्रतीक 0x10045740" जो कुछ के तहत काम नहीं करेगा स्थितियां (धन्यवाद @ थॉमसा 88)।

+3

यह केवल/home/thomas/.kde4/lib64/kde4/kmm_lft.so' के अनुभाग .text में प्रतीक + ऑफ़सेट ('LftPlugin :: import_clicked() const + 1522 प्रदर्शित करता है, जबकि 'जानकारी पंक्ति * 0xabc' शो लाइन नंबर ('लाइन 97 का "प्लगइन/lft_plugin.cpp" पता 0x7fffe49eb39c पर शुरू होता है और 0x7fffe49eb3ad ।) पर समाप्त होता है। मेरे मामले में मेरी साझा लाइब्रेरी को तब तक नहीं हटाया गया है, लेकिन जब प्रतीक छीन लिया जाता है तो 'ऐड-सिंबल-फ़ाइल फ़ाइल नाम पता' संभवतः मदद कर सकता है। http://www.delorie.com/gnu/docs/gdb/gdb_125.html – thomasa88

+3

धन्यवाद thomasa88! जीडीबी के अंदर 'जानकारी लाइन * 0x10045740' (तारांकन याद रखें) नौकरी करता है। –

 संबंधित मुद्दे