मैं आमतौर पर एक कार्यक्रम चलाता हूं:
./a.out arg1 arg2 <file
मैं इसे gdb का उपयोग करके डीबग करना चाहूंगा।
मुझे set args
कार्यक्षमता की जानकारी है , लेकिन यह केवल gdb प्रॉम्प्ट से काम करता है।
मैं आमतौर पर एक कार्यक्रम चलाता हूं:
./a.out arg1 arg2 <file
मैं इसे gdb का उपयोग करके डीबग करना चाहूंगा।
मुझे set args
कार्यक्षमता की जानकारी है , लेकिन यह केवल gdb प्रॉम्प्ट से काम करता है।
जवाबों:
run
कमांड को gdb के भीतर से पास करें ।
$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t
$ gdb ./a.out
तो (gdb) r < t arg1 arg2
जो मेरे लिए ठीक काम करता है। मेरे मामले में a.out = nft
arg1 = import
arg2 = json
औरt = file containing json rules
तुम यह केर सकते हो:
gdb --args path/to/executable -every -arg you can=think < of
जादू सा --args
।
run
डिबगिंग शुरू करने के लिए बस gdb कमांड कंसोल में टाइप करें ।
--args
तो निष्पादन योग्य को पारित किए गए कोई तर्क नहीं हैं , इसलिए यह शायद ही अस्पष्ट है।
argv[0]
से निष्पादन योग्य का नाम है
gdb
स्वयं के इनपुट को रीडायरेक्ट करेगा of
और परिणाम देगा gdb इससे कमांड निष्पादित करने की कोशिश कर रहा है
यदि आप अपने कार्यक्रम को पुनर्निर्देश और तर्कों के साथ निष्पादित करने के लिए नंगे run
कमांड रखना चाहते हैं gdb
, तो आप इसका उपयोग कर सकते हैं set args
:
% gdb ./a.out
(gdb) set args arg1 arg2 <file
(gdb) run
मैं --args
पैरामीटर के साथ समान व्यवहार को प्राप्त करने में असमर्थ था , gdb
जमकर पुनर्निर्देशन से बच जाता है, अर्थात
% gdb --args echo 1 2 "<file"
(gdb) show args
Argument list to give program being debugged when it is started is "1 2 \<file".
(gdb) run
...
1 2 <file
...
यह वास्तव में स्वयं gdb के इनपुट को पुनर्निर्देशित करता है, न कि हम वास्तव में यहाँ क्या चाहते हैं
% gdb --args echo 1 2 <file
zsh: no such file or directory: file
अपने प्रोजेक्ट पर GDB प्रारंभ करें।
प्रोजेक्ट डायरेक्टरी पर जाएं, जहां आपने पहले ही प्रोजेक्ट को एक्जीक्यूबल कर लिया है। आदेश gdb और निष्पादन योग्य का नाम नीचे के रूप में जारी करें:
gdb projectExecutablename
यह gdb शुरू करता है, निम्नलिखित प्रिंट करता है: GNU gdb (Ubuntu 7.11.1-0ubuntu1 ~ 16.04) 7.11.1 कॉपीराइट (C) 2016 फ्री सॉफ्टवेयर फाउंडेशन, इंक। ............... .................................. "शब्द" से संबंधित आदेशों की खोज करने के लिए "एप्रोपोस शब्द" टाइप करें। पढ़ना। परियोजना से प्रतीक चिह्न। (Gdb)
इससे पहले कि आप अपना प्रोग्राम चालू करें, आप अपने ब्रेकप्वाइंट सेट करना चाहते हैं। ब्रेक कमांड आपको ऐसा करने की अनुमति देता है। मुख्य नाम के फ़ंक्शन की शुरुआत में एक ब्रेकपॉइंट सेट करने के लिए:
(gdb) बी मुख्य
आपके पास (gdb) प्रॉम्प्ट होने के बाद, रन कमांड निष्पादन योग्य रनिंग शुरू करता है। यदि आप जिस प्रोग्राम में डिबगिंग कर रहे हैं, उसे किसी भी कमांड-लाइन तर्क की आवश्यकता होती है, तो आप उन्हें रन कमांड को निर्दिष्ट करते हैं। यदि आप "xfiles" फ़ाइल पर मेरा प्रोग्राम चलाना चाहते थे (जो कि प्रोजेक्ट डायरेक्टरी में "mulder" फ़ोल्डर में है), तो आप निम्नलिखित कार्य करेंगे:
(gdb) r mulder / xfiles
उम्मीद है की यह मदद करेगा।
डिस्क्लेमर: यह समाधान मेरा नहीं है, यह https://web.stanford.edu/class/cs107/guide_gdb.html से अनुकूलित है। gdb के लिए यह संक्षिप्त मार्गदर्शिका थी, जो संभवतः स्टैनफोर्ड यूनिवर्सिटी में विकसित की गई थी।
debug
किसी भी कमांड के सामने टाइप करने के लिए अच्छा नहीं होगा कि इसके साथ डिबग किया जा सकेgdb
शेल स्तर पर ?
इसके नीचे यह फ़ंक्शन है। यह निम्नलिखित के साथ भी काम करता है:
"$program" "$@" < <(in) 1> >(out) 2> >(two) 3> >(three)
यह एक ऐसी कॉल है जिसमें आप कुछ भी नियंत्रित नहीं कर सकते हैं, सब कुछ परिवर्तनशील है, इसमें रिक्त स्थान, लाइनफीड और शेल मेटाचैकर शामिल हो सकते हैं। इस उदाहरण में, in
, out
, two
, औरthree
मनमाने ढंग से अन्य आदेशों जो उपभोग या डेटा का उत्पादन जो नुकसान नहीं किया जाना चाहिए।
bash
समारोह के बाद gdb
ऐसे वातावरण में लगभग सफाई से आह्वान किया जाता है [ Gist ]:
debug()
{
1000<&0 1001>&1 1002>&2 \
0</dev/tty 1>/dev/tty 2>&0 \
/usr/bin/gdb -q -nx -nw \
-ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" exec' \
-ex r \
--args "$@";
}
इसे लागू करने के तरीके पर उदाहरण: बस टाइप करें debug
सामने :
इससे पहले:
p=($'\n' $'I\'am\'evil' " yay ")
"b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)
उपरांत:
p=($'\n' $'I\'am\'evil' " yay ")
debug "b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)
बस। अब इसके साथ डिबग करने के लिए एक निरपेक्ष नो-ब्रेनर है gdb
। कुछ विवरण या अधिक को छोड़कर:
gdb
स्वचालित रूप से बाहर नहीं निकलता है और इसलिए IO पुनर्निर्देशन को तब तक खुला रखता है जब तक आप बाहर नहीं निकल जाते gdb
। लेकिन मैं इसे एक सुविधा कहता हूं।
आप आसानी argv0
से इस तरह से कार्यक्रम को पास नहीं कर सकते exec -a arg0 command args
। के बाद: इस चाल करना चाहिए के बाद exec-wrapper
परिवर्तन "exec
करने के लिए"exec -a \"\${DEBUG_ARG0:-\$1}\"
।
1000 से ऊपर एफडी हैं, जो सामान्य रूप से बंद हैं। यदि यह एक समस्या है, तो 0<&1000 1>&1001 2>&1002
पढ़ने के लिए बदलें0<&1000 1>&1001 2>&1002 1000<&- 1001>&- 1002>&-
आप समानांतर में दो डीबगर नहीं चला सकते हैं। कुछ अन्य कमांड उपभोग /dev/tty
(या STDIN) होने पर भी समस्याएँ हो सकती हैं । इसे ठीक करने के लिए, के /dev/tty
साथ बदलें "${DEBUGTTY:-/dev/tty}"
। किसी अन्य TTY प्रकार में tty; sleep inf
और फिर /dev/pts/60
डीबगिंग के लिए मुद्रित TTY (i। E. ) का उपयोग करें , जैसे कि DEBUGTTY=/dev/pts/60 debug command arg..
। यह पॉवर ऑफ शेल है, इसकी आदत डाल लें!
समझाया गया कार्य:
1000<&0 1001>&1 1002>&2
पहले 3 एफडी दूर ले जाता है
0</dev/tty 1>/dev/tty 2>&0
अपने वर्तमान TTY को इंगित करने के लिए पहले 3 FD को पुनर्स्थापित करता है। तो आप नियंत्रण कर सकते हैं gdb
।/usr/bin/gdb -q -nx -nw
चलाता है gdb
invokes gdb
खोल पर-ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\""
एक स्टार्टअप रैपर बनाता है, जो पहले 3 एफडी को पुनर्स्थापित करता है जो 1000 और उससे अधिक बचाए गए थे-ex r
का उपयोग कर कार्यक्रम शुरू करता है exec-wrapper
--args "$@"
दिए गए तर्कों को पारित करता हैयह इतना आसान नहीं था?
r
के लिए कम हैrun
और आप किसी भी तर्क के साथ इसका पालन कर सकते हैं। इस प्रश्न की तरह, यह होगा:r arg1 arg2 <file
या यह हो सकता हैrun arg1 arg2 <file