2013-11-24 5 views
15

मुझे आश्चर्य है कि जीडीबी के माध्यम से एक एप्लीकेशन लॉन्च करना संभव है, एक सेगफॉल्ट पर फ़ाइल को बैकट्रैक लिखें (बाद में देखने के लिए), और फिर बिना किसी उपयोगकर्ता इनपुट के जीडीबी से बाहर निकलें।जीडीबी बैकट्रैक कोई उपयोगकर्ता इनपुट के साथ?

मैं एक गैर-इंटरैक्टिव सत्र से ओएस बूट पर एक अनंत लूप में एक शेल स्क्रिप्ट से एक एप्लिकेशन चला रहा हूं (इसलिए यदि यह इसे पुनः लोड करता है)। एप्लिकेशन एक गैर-पुनरुत्पादित तरीके से क्रैश हो रहा है इसलिए मुझे इस मुद्दे को डीबग करने के लिए क्रैश से बैकट्रैक चाहिए। आदर्श रूप से, मैं सिर्फ जीडीबी डीबगिंग + बैकट्रैसिंग कार्यक्षमता को शामिल करने के लिए शेल स्क्रिप्ट को संशोधित करता हूं और क्रैश के बाद एप्लिकेशन के स्वचालित पुनरारंभ को संरक्षित करता हूं।

क्या यह संभव है?

+2

http://www.commandlinefu.com/commands/view/4039/print-stack-trace-of-a-core-file-without-needing-to-enter-gdb-interactively –

+2

क्या आप कोर सक्षम नहीं कर सकते आपके सिस्टम पर फाइलें और उस तरह से बैकट्रैक प्राप्त करें? यह एक जीडीबी पाश से बहुत आसान लगता है। –

+0

'इसलिए मुझे इस मुद्दे को डीबग करने के लिए क्रैश से बैकट्रैक चाहिए।' - मुझे कोई जवाब नहीं मिला है कि आप क्रैश से कोर फ़ाइल का विश्लेषण क्यों नहीं कर सकते? क्या ऐसा इसलिए है क्योंकि यह काफी बड़ा है? –

उत्तर

17

आदित्य कुमार के लिए धन्यवाद; स्वीकार्य समाधान:

gdb -batch -ex "run" -ex "bt" ${my_program} 2>&1 | grep -v ^"No stack."$

1

यह gdb 7.6 के साथ काम करता है:

मेरा परीक्षण कार्यक्रम है कि एक कोर डंप अगर यह एक कमांड लाइन पैरामीटर दिया जाता है का कारण बनता है:

int a(int argc) 
{ 
    if (argc > 1) { 
    int *p = 0; 
    *p = *p +1; 
    return *p; 
    } 
    else { 
    return 0; 
    } 
} 

int b(int argc) 
{ 
    return a(argc); 
} 

int main(int argc, char *argv[]) 
{ 
    int res = b(argc); 
    return res; 
} 

मेरे अजगर स्क्रिप्ट my_check .py:

def my_signal_handler (event): 
    if (isinstance(event, gdb.SignalEvent)): 
    log_file_name = "a.out.crash." + str(gdb.selected_inferior().pid) + ".log" 
    gdb.execute("set logging file " + log_file_name) 
    gdb.execute("set logging on") 
    gdb.execute("set logging redirect on") 
    gdb.execute("thread apply all bt") 
    gdb.execute("q") 

gdb.events.stop.connect(my_signal_handler) 
gdb.execute("set confirm off") 
gdb.execute("set pagination off") 
gdb.execute("r") 
gdb.execute("q") 

तो, पहले मैं a.out चलाता हूं और कोई दुर्घटना नहीं है। कोई लॉग फाइल बनाई गई हैं:

gdb -q -x my_check.py --args ./a.out>/dev/बातिल

अगला मैं a.out चलाने के लिए और यह एक पैरामीटर देना :

>gdb -q -x my_check.py --args ./a.out 1 >/dev/null 

और यह एक क्रैश रिपोर्ट है:

>cat a.out.crash.13554.log 

Thread 1 (process 13554): 
#0 0x0000000000400555 in a (argc=2) at main.cpp:5 
#1 0x000000000040058a in b (argc=2) at main.cpp:15 
#2 0x00000000004005a3 in main (argc=2, argv=0x7fffffffe198) at main.cpp:20 
0

वैकल्पिक रूप से सिर्फ पश्व-अनुरेखन भंडारण के लिए, आप 012 डाल सकता है आपकी शेल स्क्रिप्ट में आपके अनंत लूप के सामने। नतीजा यह होगा कि हर बार जब आपका प्रोग्राम segfaults, यह एक फ़ाइल में एक कोर डंप लिख देगा जो मेरे सिस्टम पर सिर्फ core कहा जाता है लेकिन अन्य सिस्टम पर प्रक्रिया आईडी शामिल हो सकती है। यदि प्रोग्राम segfaults (आप इसे बाहर निकलने की स्थिति से 13 9 के बराबर देखते हैं) तो एक अद्वितीय नाम (उदाहरण के लिए टाइमस्टैम्प का उपयोग करके) core फ़ाइल को एक सुरक्षित स्थान पर सुरक्षित स्थान पर ले जाएं। इन कोर फाइलों और जीडीबी के साथ आप बैकट्रैक को देखने के अलावा और भी अधिक कर सकते हैं। इस प्रकार मुझे लगता है कि उनका उपयोग करना आपके लिए और भी उपयोगी हो सकता है।

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