मैं एक Bash स्क्रिप्ट के भीतर GDB का उपयोग करके कमांडलाइन तर्कों के साथ एक कार्यक्रम कैसे चला सकता हूं?


428

GDB पर प्रोग्राम चलाते समय, आमतौर पर, प्रोग्राम के लिए तर्क runकमांड में दिए जाते हैं । क्या जीडीबी का उपयोग करके कार्यक्रम चलाने का एक तरीका है और साथ ही साथ एक शेल स्क्रिप्ट के भीतर तर्क देना है?

मैंने संबंधित प्रश्न में एक उत्तर देखा, जिसका उल्लेख करते हुए हम स्क्रिप्ट को निष्पादित करना शुरू करने के बाद जीडीबी को कार्यक्रम में संलग्न कर सकते हैं। लेकिन तब मुझे कार्यक्रम को to इंतजार ’करना पड़ेगा।

क्या इसे करने का और कोई तरीका है?


जवाबों:


612

आप --dgs पैरामीटर के साथ gdb चला सकते हैं,

gdb --args executablename arg1 arg2 arg3

यदि आप इसे स्वचालित रूप से चलाना चाहते हैं, तो कुछ कमांड्स को एक फ़ाइल (जैसे 'रन') में रखें और इसे तर्क के रूप में दें: -x / tmp / cmds। वैकल्पिक रूप से आप -बैच मोड के साथ चला सकते हैं।

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3

53
आर्ग, man gdbइसमें शामिल नहीं है --args, इसीलिए मुझे यह नहीं मिला। gdb --helpकर देता है।
सिरो सेंटिल्ली 郝海东 冠状 iro i

1
@CiroSantilli 新疆 改造 ill ill 事件 GN GDB GNU है। GNU टूल्स के पूर्ण प्रलेखन को देखने के लिए, info gdbअगली बार :-) का उपयोग करना याद रखें ।
एपर्टेक्स

1
@Apteryx शायद एक दिन मैं सीख जाऊंगा info। अगर Google या स्टैक ओवरफ्लो XD काम करना बंद कर देता है
Ciro Santilli 冠状 Over Over Over 55

1
@CiroSantilli 新疆 改造 ill 六四 ill got मैं 'मैं' कुंजी ( index-search) की खोज के बाद जानकारी के लिए आदी हो गया । कोशिश करें: info gdbफिर 'मैं', फिर '--र्ग'। यह आपको सही पर लाएगा।
एपर्टेक्स

138
gdb -ex=r --args myprogram arg1 arg2

-ex=rके लिए कम है -ex=runऔर तुरंत प्रोग्राम में "रन" टाइप करने के लिए आपके प्रोग्राम को चलाने के बजाय gdb को बताता है। फिर --argsकहता है कि जो कुछ भी है वह कमांड और तर्क है, जैसे आप सामान्य रूप से कमांडलाइन प्रॉम्प्ट पर टाइप करेंगे।


-exe=rबहुत उपयोगी के बारे में पता नहीं था !
जीफ

46

ऐसा करने का एक और तरीका, जिसे मैं व्यक्तिगत रूप से थोड़ा अधिक सुविधाजनक और सहज ( --argsपैरामीटर को याद किए बिना ) पाता हूं , सामान्य रूप से संकलन करना है, और r arg1 arg2 arg3सीधे भीतर से उपयोग करना है gdb, जैसे:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3

23
यह वही है जो ओपी करने से बचने की उम्मीद कर रहा है।
कराटेस्नोमाचाइन

6
हम्म, हाँ, धन्यवाद, उचित बिंदु। मुझे यकीन नहीं है कि यह इतने लंबे समय तक मेरे नोटिस से कैसे बच गया। मुझे लगता है कि मैं जवाब यहाँ छोड़ दूँगा, हालाँकि, क्योंकि iirc, मैंने इस सवाल पर ठोकर खाई थी जब मैं "gdb का उपयोग करके कमांड लाइन तर्क पास कैसे करना है" जैसे कुछ गुगली कर रहा था, और उत्तर को गुम होने पर, मैं इसे जोड़ने के लिए आगे बढ़ा। , बिना साकार के (लगभग एक वर्ष के लिए!) कि मेरे उत्तर ने प्रश्न को हाथ में नहीं लिया।
aspiring_sarge

2
@KarateSnowMachine Google से आने वाले किसी व्यक्ति के रूप में, यह उत्तर उस रेखा के साथ अधिक है जो मैं खोज रहा था। शायद हमें इस प्रश्न को अधिक सामान्य होना चाहिए क्योंकि इसके पास ऐसा सामान्य शीर्षक है, या शायद हमें शीर्षक को संकीर्ण करना चाहिए। इसे कम प्रतिबंधात्मक बनाना शायद अधिक से अधिक पाठकों के लिए उपयोगी होगा।
jpmc26


4

gdb के पास --init-command <somefile>जहां somefile में चलाने के लिए gdb कमांड की एक सूची है, मैं //GDBअपने कोड में टिप्पणी करने के लिए इसका उपयोग करता हूं, फिर `

echo "file ./a.out" > run
grep -nrIH "//GDB"|
    sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
    awk '{print "b" " " $1}'|
    grep -v $(echo $0|sed "s/.*\///g") >> run
gdb --init-command ./run -ex=r

एक स्क्रिप्ट के रूप में, जो डिबग प्रतीकों को लोड करने के लिए कमांड डालता है, और फिर प्रत्येक //GDBटिप्पणी के लिए एक ब्रेक पॉइंट डालने के लिए ब्रेक कमांड की एक सूची बनाता है , और इसे चालू करता है


4

यदि --argsपैरामीटर आपकी मशीन पर काम नहीं कर रहा है (यानी सोलारिस 8 पर), तो आप जैसे जीडीबी शुरू कर सकते हैं

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"

और आप इसे एक फ़ाइल को स्टड करने के लिए इनपुट कर सकते हैं और "तुरंत खरीदा गया":

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"

2

ह्यूगो इडेलर के जवाब के अलावा। जब उनके जैसे उपसर्ग वाले तर्कों का उपयोग किया जाता है --या -, मुझे gdb के साथ संघर्ष करना निश्चित नहीं था।

ऐसा लगता है argsकि प्रोग्राम के लिए तर्क के रूप में ऑप्शन के बाद gdb लेता है ।

सबसे पहले मैं निश्चित होना चाहता था, मैंने आपके args के आसपास के उद्धरणों के साथ gdb चलाया, इसे लॉन्च पर हटा दिया गया।

यह भी काम करता है, लेकिन वैकल्पिक:

gdb --args executablename "--arg1" "--arg2" "--arg3"

यह काम नहीं करता है:

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui

उस स्थिति में, -tuiमेरे प्रोग्राम पैरामीटर के रूप में प्रयोग किया जाता है gdb के रूप में नहीं।


1

बहुत देर हो चुकी है, लेकिन यहां एक विधि है जो gdbसत्र के दौरान काम करती है ।

gdb <executable>

फिर

(gdb) apropos argument

यह बहुत सारे मैच लौटाएगा, उपयोगी है set args

set args -- Set argument list to give program being debugged when it is started.

set args arg1 arg2 ...

फिर

r

यह प्रोग्राम चलाएगा, मुख्य (argc, argv) तर्कों और तर्क की गणना के लिए।

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