2008-09-16 8 views
24

जब आप एक ही कंप्यूटर पर निष्पादन योग्य फ़ाइल पर एक सामान्य जीडीबी सत्र कर रहे हैं, तो आप रन कमांड दे सकते हैं और यह प्रोग्राम को फिर से शुरू कर देगा।'लक्ष्य रिमोट' के साथ जीडीबी में प्रोग्राम को फिर से चलाने शुरू कैसे करें?

जब आप एक एम्बेडेड सिस्टम पर gdb चला रहे हैं, कमांड लक्ष्य लोकहोस्ट के साथ:', आप अपने जीडीबी सत्र को छोड़कर और फिर से शुरू किए बिना प्रोग्राम को फिर से कैसे शुरू करते हैं?

उत्तर

5

दुर्भाग्यवश, मुझे एप्लिकेशन को पुनरारंभ करने और अभी भी अपना सत्र बनाए रखने का कोई तरीका नहीं पता है। एक कामकाज पीसी को अपने प्रोग्राम के प्रवेश बिंदु पर सेट करना है। आप या तो बुला कर ऐसा कर सकते हैं:

jump function

या

set $pc=address

यदि आपने main पर तर्कों को गले लगाया है तो आपको उन्हें फिर से सेट करने की आवश्यकता हो सकती है।

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

वहाँ उपरोक्त विधि कि समस्याएं पैदा कर सकता साथ चेतावनियां के एक जोड़े हैं।

  • यदि आप बहु-थ्रेडेड प्रोग्राम में हैं तो मुख्य पर कूदने से वर्तमान थ्रेड मुख्य पर कूद जाएगा, अन्य सभी धागे बने रहेंगे। यदि वर्तमान धागे में एक ताला लगा है ... तो आपको कुछ समस्याएं हैं।
  • मेमोरी लीक, यदि आप प्रोग्राम प्रवाह प्रारंभिकरण के दौरान कुछ सामान आवंटित करते हैं तो आप कूद के साथ स्मृति का एक गुच्छा लीक करते हैं।
  • ओपन फाइलें अभी भी खुली रहेंगी। अगर आप कुछ फाइलों या पते को एमएमएपी करते हैं, तो कॉल अधिकतर असफल हो जाएगा।

तो, कूद का उपयोग प्रोग्राम को पुनरारंभ करने जैसा ही नहीं है।

+0

एक साधारण गैर बहु ​​थ्रेडेड ऐप के लिए, कूद बिल्कुल वही था जो मुझे चाहिए था। – wulfgarpro

4

संभवतः आप एम्बेडेड सिस्टम पर gdbserver चला रहे हैं।

इसके बजाय आप target extended-remote

+0

सहायक, लक्ष्य विस्तारित मोड के बारे में नहीं था। धन्यवाद। – sstock

+1

लिंक टूटा हुआ है। – Greg

2

"कूद _start" के साथ बाहर निकलने के अपने कार्यक्रम को पुनः आरंभ करने के लिए इसे पूछ सकते हैं हमेशा की तरह है।

0

लिए देख रहे हैं आप चला रहे हैं नियमित रूप से gdb आप टाइप कर सकते हैं 'रन' शॉर्टकट 'आर' और यदि आप इस कार्यक्रम

0

को पुनः आरंभ करने के लिए मुझे विधि के लिए इच्छा gdb लिए कहता है 21.2 Sample GDB session startup में वर्णित महान काम करता है। जब मैं monitor reset halt में बाद में "(gdb)" संकेत देता हूं तो लक्ष्य हार्डवेयर रीसेट हो जाता है और मैं c (= जारी) के साथ एप्लिकेशन को फिर से शुरू कर सकता हूं।

load आदेश रन के बीच छोड़ा जा सकता है क्योंकि कार्यक्रम बार-बार फ्लैश करने की कोई जरूरत नहीं होती है।

1

चरण-दर-चरण प्रक्रिया

रिमोट:

# pwd contains cross-compiled ./myexec 
gdbserver --multi :1234 

स्थानीय:

# pwd also contains the same cross-compiled ./myexec 
gdb -ex 'target extended-remote 192.168.0.1:1234' \ 
    -ex 'set remote exec-file ./myexec' \ 
    --args ./myexec arg1 arg2 
(gdb) r 
[Inferior 1 (process 1234) exited normally] 
(gdb) r 
[Inferior 1 (process 1235) exited normally] 
(gdb) monitor exit 

Ubuntu 14.04 में परीक्षण किया गया।

यह भी रूप में कार्यक्रम के लिए CLI तर्क पारित करने के लिए संभव है:

gdbserver --multi :1234 ./myexec arg1 arg2 

और ./myexec हिस्सा set remote exec-file ./myexec के लिए की जरूरत निकालता है, लेकिन यह निम्न खीज है:

दर्रा वातावरण चर और पुन: प्रारंभ बिना काम निर्देशिका बदलने के लिए: How to modify the environment variables and working directory of gdbserver --multi without restarting it?

0

सुझावों में से EFM32 मुबारक छिपकली कोई भी पर इसलिए यहाँ, मेरे लिए काम करेगा जो मैं ग्रहण वातावरण में GDB के एकीकरण पर प्रलेखन से सीखा है है ।

(gdb) mon reset 0 
(gdb) continue 
(gdb) continue 

यह मुझे राज्य में रखता है कि आईडीई से रीसेट करते समय मुझे उम्मीद थी।