2010-09-18 13 views
11

मैं एक डिबगिंग स्क्रिप्ट का उपयोग करता हूं जो डीबगर के साथ उत्तराधिकार में कई संबंधित प्रक्रियाओं को चलाता है। मैं वर्तमान में कई आदेशों को निष्पादित करने के लिए -x का उपयोग कर रहा हूं (जैसे run)। डीबग प्रक्रिया सफलतापूर्वक समाप्त होने पर मैं जीडीबी स्वचालित रूप से कैसे छोड़ सकता हूं? कमांड फ़ाइल में quit कमांड को जोड़ने से कमांड को केवल सफल समाप्ति पर ही प्रबंधित नहीं किया जाएगा, लेकिन जब त्रुटियां भी होती हैं (जब मैं उस बिंदु पर ले जाऊंगा)। gdbbatch कीसफल समाप्ति पर जीडीबी स्वचालित रूप से छोड़ दें?

+ gdb -return-child-result -x gdbbatch --args ./mkfs.cpfs /dev/loop0 
GNU gdb (GDB) 7.1-ubuntu 
Reading symbols from /home/matt/cpfs/mkfs.cpfs...done. 

Program exited normally. 
Breakpoint 2 at 0x805224f: file log.c, line 32. 
(gdb)

सामग्री::

यहाँ क्या हो रहा है के एक उद्धरण है

start 
b cpfs_log if level >= WARNING
+1

वहाँ एक उपयोगी जवाब के साथ एक नकली Stackoverflow सवाल है।कॉम/ए/8657833/431087 –

उत्तर

4

GDB एक अलग GDB/एमआई बुलाया स्वचालित कार्यक्रमों के साथ बातचीत के लिए 'भाषा' है (विस्तृत here) , लेकिन दुर्भाग्यवश, ऐसा लगता है कि यह सशर्तयों का समर्थन नहीं करता है, और अन्य कार्यक्रमों से पार्सिंग और ब्रांचिंग के साथ चलाने की उम्मीद है। तो, ऐसा लगता है कि अपेक्षा सबसे आसान (या कम से कम एक काम) समाधान है:

$ cat gdbrunner 
#!/usr/bin/expect -f 

#spawn gdb -return-child-result --args ./mkfs.cpfs /dev/loop0 
spawn gdb -return-child-result --args [lindex $argv 0] 

#send "start\n" 
#send "b cpfs_log if level >= WARNING" 
send "run\n" 

expect { 
    normally\.   { send "quit\n" } 
    "exited with code" { interact -nobuffer } 
} 

मैं साधारण कार्यक्रम के साथ इस परीक्षण किया:

$ cat prog1.c 
int main(void) { return 0; } 
$ cat prog2.c 
int main(void) { return 1; } 
निम्न परिणाम के साथ

:

$ ./gdbrunner ./prog1 
spawn gdb -return-child-result --args ./prog1 
run 
(gdb) run 
Starting program: /home/foo/prog1 

Program exited normally. 
(gdb) quit 
$ ./gdbrunner ./prog2 
spawn gdb -return-child-result --args ./prog2 
run 
(gdb) run 
Starting program: /home/foo/prog2 

Program exited with code 01. 
(gdb) 

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

आप जीडीबी/एमआई इंटरफ़ेस का उपयोग जीडीबी को -i कमांड-लाइन तर्क के साथ संशोधित करने के लिए भी संशोधित कर सकते हैं; इसके आदेश और आउटपुट थोड़ा अधिक आसानी से पारदर्शी हैं, यदि आप पहले से जुड़े दस्तावेज़ों में देख सकते हैं, तो आप अधिक उन्नत सुविधाओं की आवश्यकता के लिए विस्तार करेंगे।

11

gdb $_exitcode सेट करता है जब प्रोग्राम सफलतापूर्वक समाप्त हो जाता है। आप कर सकते हैं कि के उपयोग - अपनी स्क्रिप्ट के शुरू में एक अप्रत्याशित मूल्य के लिए सेट है, और केवल quit अंत में यह बदल गया है, तो:

set $_exitcode = -999 
# ... 
run 
# ... 
if $_exitcode != -999 
    quit 
end 

(एक अप्रत्याशित मूल्य के लिए $_exitcode स्थापना थोड़ा बदसूरत है, लेकिन यह प्रोग्राम को समाप्त नहीं होने पर अन्यथा परिभाषित नहीं किया जाएगा, और एक सशर्त में "यह चर परिभाषित किया गया है" पूछने का कोई स्पष्ट तरीका प्रतीत नहीं होता है।)

+0

[यह दस्तावेज़] (http://info2html.sourceforge.net/cgi-bin/info2html-demo/info2html? (gdb.info.gz) सुविधा% 2520Funs) दिखाता है कि '_isvoid का उपयोग कैसे करें '_exitcode' के साथ इसे" असंभव मान "पर सेट करने से बचने के लिए। –

8

मुझे लगता है कि मेरे पास है How to make gdb send an external notification on receiving a signal? में समान कुछ ढूंढने के संबंध में आपके प्रश्न का पूरा समाधान मिला। ऐसा लगता है कि अन्य लोगों में से कोई भी उल्लेख नहीं किया है या gdb hooks खोजा है।

$ _exitcode के बारे में मैथ्यू की नोक के आधार पर, यह अब मेरा ऐप/.gdbinit है जो वास्तव में व्यवहार चाहता था; सामान्य सफल समापन पर छोड़ दिया और whatnot बाकी सब पर gdb शीघ्र करने के लिए छोड़, ईमेल भेजते हैं,: http: // stackoverflow

set $_exitcode = -999 
set height 0 
handle SIGTERM nostop print pass 
handle SIGPIPE nostop 
define hook-stop 
    if $_exitcode != -999 
     quit 
    else 
     shell echo | mail -s "NOTICE: app has stopped on unhandled signal" root 
    end 
end 
echo .gdbinit: running app\n 
run 
संबंधित मुद्दे