GDB में स्वचालित रूप से निष्पादन योग्य कैसे चलाएं?


92

मैं gdbतुरंत निष्पादन योग्य चलाना चाहता हूं, जैसे कि मैं "रन" टाइप करूंगा (प्रेरणा: मैं "रन" टाइप करना पसंद करता हूं)।

एक तरीका यह है कि कमांड को gdbइस तरह से पाइप करें:

$ echo run | gdb myApp

लेकिन इस दृष्टिकोण के साथ समस्या यह है कि आप के साथ अन्तरक्रियाशीलता खो देते हैं gdb, जैसे। यदि कोई ब्रेकपॉइंट ट्रिगर या myAppक्रैश होता है, तो gdbक्विट करता है। इस विधि की चर्चा यहाँ की गई है

में विकल्पों को --helpदेखते हुए , मुझे ऐसा करने का कोई तरीका नहीं दिखता है, लेकिन शायद मुझे कुछ याद आ रहा है।

जवाबों:


128
gdb -ex run ./a.out

यदि आपको तर्क पारित करने की आवश्यकता है a.out:

gdb -ex run --args ./a.out arg1 arg2 ...

संपादित करें: ओरियन का कहना है कि यह मैक OSX पर काम नहीं करता है।

-exझंडा बाद से उपलब्ध है GDB-6.4(2005 में जारी), लेकिन OSX GDB की एप्पल के कांटा का उपयोग करता है, और तेंदुए के लिए नवीनतम XCode शामिल GDB 6.3.50-20050815 (Apple version gdb-967)है, तो आप भाग्य से बाहर हैं।

वर्तमान GDB-7.0.1रिलीज का निर्माण एक संभव समाधान है। बस पढ़ लें यह


1
जवाब के लिए धन्यवाद। यह पंक्ति मेरे लिए "gdb ./a.out" के समान है।
ओरियन एल्जेनिल

3
मैंने अभी पुष्टि की है कि आप कमांड लाइन पर कई -ex विकल्प भी पास कर सकते हैं और वे आपके लिए gdb इनपुट स्थानांतरित करने से पहले चलेंगे।
तुंग गुयेन

यदि प्रोग्राम में दलीलें हों तो यह समाधान काम नहीं करता:./a.out a b
gIGibala

चूंकि OSX / xcode अब gdb को बॉक्स से बाहर का समर्थन नहीं करता है (lldb नया gdb है), यह अब बेहतर दृष्टिकोण की तरह लगता है।
ओरियन एल्जेनिल

मैंने gdb -xलिनक्स सिस्टम पर एक कमांड फाइल और उपयोग किया। ओएस एक्स का उपयोग करता LLVM और बजना तो की डिबगिंग क्षमताओं की जाँच lldb
डेइसुके अरामकी

22

मैं एक gdb-स्क्रिप्ट का उपयोग करूंगा:

gdb -x your-script

जहाँ आपकी स्क्रिप्ट में कुछ ऐसा है:

file a.out
b main
r

बाद में आपके पास सामान्य इंटरैक्टिव जीडीबी प्रॉम्प्ट है

संपादित करें :

यहाँ वास्तव में आलसी के लिए एक अनुकूलन है:

  1. स्क्रिप्ट को इस रूप .gdbinitमें सहेजें working directory
  2. बाद में आप बस के रूप में gdb चलाते हैं

    gdb

... और gdb स्वचालित रूप से .gdbinit की सामग्री को लोड और निष्पादित करता है।


उत्तर के लिए हे धन्यवाद। ऐसा लगता है कि मैं सिर्फ यही चाहता हूं, सिवाय इसके कि मुझे gdb प्रॉम्प्ट न मिले, मुझे gdb सस्पेंड किया जा रहा है और मैं कमांड लाइन पर वापस आ रहा हूं जैसे कि मैंने "ctrl-z" टाइप किया था। अगर मैं "एफजी" करता हूं, तो जीडीबी फिर से शुरू होता है और ऐप चलता है। यह ओएस एक्स है
ओरियन एल्जेनिल

ओरियन: mmmh - यह मेरे लिए आश्चर्य की बात है। हर UNIX स्वाद के साथ अच्छी तरह से काम करता है जिसका मैं वास्तव में उपयोग कर रहा हूं (लिनक्स, सोलारिस, एआईएक्स)। आप किस gdb संस्करण का उपयोग कर रहे हैं?

मैंने अभी-अभी इसके व्यवहार की पुष्टि की है - फिर भी मुझे कमांड लाइन w / gdb सस्पेंड कर दिया गया है। GNB gdb 6.3.50-20050815 (Apple संस्करण gdb-1518) (सत फरवरी 12 02:52:12 UTC 2011)।
ओरियन एल्जेनिल

@orionelenzil पता नहीं क्यों, लेकिन अगर आप लाइन के fgबाद डालते हैं r, तो यह
पवित्र रूप से

startआदेश के लिए एक शॉर्टकट प्रदान करता है b+ r: stackoverflow.com/a/2119606/895245
सिरो Santilli郝海东冠状病六四事件法轮功

20
(echo r ; cat) | gdb a.out

जीडीबी टूटने के बाद बिल्ली आपको टाइप करने की अनुमति देती है।


वाह, बहुत बढ़िया। बिल्ली को रोकने के लिए gdb से बाहर निकलने के बाद आपको ctrl-c करना होगा, लेकिन यह बहुत अच्छा है।
ओरियन एलेंजिल

3
ऐसा लगता है कि आप इसका उपयोग करके gdb उदाहरण पर कुछ कुंजी-नियंत्रण खो देते हैं।
ट्रेविनाओ

इसके अलावा, जैसे सवाल Make breakpoint pending on future shared library load? (y or [n])स्वतः उत्तर "नहीं" मान लेंगे।
रुस्लान

6

start आदेश

यह आदेश एक और अच्छा विकल्प है:

gdb -ex start --args ./a.out arg1 arg2

यह रन की तरह है, लेकिन एक अस्थायी ब्रेकपॉइंट भी सेट करता है main और वहां रुक जाता है।

हिट होते ही यह अस्थायी ब्रेकपॉइंट निष्क्रिय कर दिया जाता है।

starti

एक संबंधित भी है startiजो कार्यक्रम शुरू करता है और इसके बजाय पहले निर्देश पर रुक जाता है, यह भी देखें: GDB में पहली मशीन कोड निर्देश पर रोक

महान जब आप कुछ निम्न स्तर के सामान कर रहे हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.