प्रोग्राम स्टड को लोड करने और gdb में पैरामीटर लेने का तरीका?


101

मेरे पास एक प्रोग्राम है जो स्टड से इनपुट लेता है और कमांड लाइन से कुछ पैरामीटर भी लेता है। यह इस तरह दिख रहा है:

cat input.txt > myprogram -path "/home/user/work"

मैं कोड को डीबीडी के अंदर डीबीडी के साथ डीबग करने की कोशिश करता हूं, एमएक्स जीडीबी द्वारा, मैं प्रोग्राम को कमांड के साथ लोड करने का प्रयास करता हूं:

gdb cat input.txt > myprogram -path "/home/user/work"

हालांकि, जीडीबी इसे पसंद नहीं करता है।

यहां से सवाल उठता है । दुर्भाग्य से मैं समाधान नहीं समझता हूं और यह सुनिश्चित नहीं कर रहा हूं कि -gविकल्प के साथ संकलन करने और कमांड एमएक्स जीडीबी चलाने से आगे क्या करना है ।

जवाबों:


132

यदि आप इसे एक शेल से कर रहे थे तो आप इसे इस तरह से करेंगे:

% gdb myprogram
gdb> run params ... < input.txt

यह emacs के भीतर भी काम करने लगता है।


पुनर्निर्देशन काम करने लगता है लेकिन मुझे कुछ त्रुटियां मिलती हैं। स्मृति से मान्य ऑब्जेक्ट फ़ाइल छवि को पढ़ने में विफल। प्रोग्राम 042 कोड के साथ बाहर निकल गया। कोई विचार?
vinc456

यह संभवतः एक सामान्य GDB त्रुटि है, और संभवतः इस तथ्य से कोई लेना देना नहीं है कि आप emacs के भीतर चल रहे हैं। पहले GDB को शेल से चलाना सीखें (यदि आवश्यक हो तो एक नए प्रश्न के साथ), और फिर इसे emacs के अंदर चलाने के बारे में चिंता करें।
अलनीतक

1
मैं यह समझ गया। किसी कारण से मैंने "int main ..." के बजाय void main (int argc, char * argv []) टाइप किया और इससे मेरी आँख फिसल गई। वैसे भी अब सब कुछ ठीक काम करता है; आपकी सहायताके लिए धन्यवाद!
vinc456

2
एक बेल्टेड थैंक्यू - gdb मैनुअल बट में एक दर्द है जिसके माध्यम से ड्रेज किया जाता है।
नष्ट कर दिया

1
विंडोज msys64 के प्रयोग पर मैं <और input.txtके रूप में argvमेरे कार्यक्रम के लिए तर्क :( मैं अपने gdb 8.2.1 के साथ इन उत्तरों के आसपास खुदाई रखेंगे: stackoverflow.com/questions/3544325/...
ixe013

32

इसे करने के कई तरीके हैं:

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

या

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

या

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

जहाँ gdb runकमांड ( r) डिफ़ॉल्ट रूप से तर्कों का उपयोग करता है जैसा कि पहले सेट किया गया था set args


4
जब मैं इसे ggb के साथ cygwin में आज़माता हूं, तो यह काम नहीं करता है। "शो आर्ग्स" कमांड से पता चलता है कि मैंने अपने इच्छित आर्ग में प्रवेश किया, लेकिन जब मैं "आर" के साथ कार्यक्रम शुरू करता हूं, तो प्रोग्राम तब तक इंतजार करता है जब तक कि मैं निर्दिष्ट फ़ाइल से पढ़ने के बजाय सामान टाइप नहीं करता।
कार्डिफ स्पेस मैन

1
@cardiffspaceman, ठीक है, मैं इसे साइग्विन के साथ परीक्षण नहीं कर सकता - शायद उनका gdb संस्करण किसी तरह सीमित है
अधिकतम 15'12

बस gdb -ex 'r -path /home/user/work < input.txt' myprogramतीसरे संस्करण में क्यों नहीं ?
रुस्लान

@Ruslan, साथ ही काम करता है - 'सेट आर्ग्स ...' का उपयोग करने से आपको बस कार्यक्रम चलाने से पहले कुछ ब्रेक पॉइंट्स को इंटरेक्टिवली परिभाषित करने का मौका मिलता है
maxschlepzig

सच है, लेकिन आप ब्रेकपॉइंट को गैर-अंतःक्रियात्मक रूप से भी सेट कर सकते हैं, जैसे gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram
रुस्लान

6

डिबगिंग सत्र शुरू करने के लिए पूर्णता के लिए - विकल्प विकल्प भी है। अर्थात)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3

14
आप इस तरह एक डिबगिंग सत्र शुरू करने पर अपने इनपुट के रूप में input.txt को कैसे पुनर्निर्देशित करेंगे?
पीटर अज़ताई

1
@ पेटर:gdb --args yourprog.out input.txt
बेन एल्गर

1
यह तभी काम करता है जब "Yourprog" इनपुट निर्दिष्ट करने के लिए फ़ाइल नाम की अपेक्षा करता है, इनपुट पुनर्निर्देशन नहीं।
अलनीतक

0

और यदि आपको शुरुआत से ही डिबग करने की आवश्यकता नहीं है, तो आप उपयोग करके पहले से चल रही प्रक्रिया से भी जुड़ सकते हैं:

$ gdb myprogram xxx

जहां xxx प्रक्रिया आईडी है। तब आपको gdb को आरंभिक तर्क बताने की आवश्यकता नहीं है।


4
आप प्रश्न शीर्षक का जवाब देने में चूक गए, "रीडिंग स्टडिन" भाग पर। अगर यह छोटा होता तो मैं कहीं अच्छी टिप्पणी करता।
15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.