2012-05-15 35 views
6

का उपयोग कर gdb async मोड में नहीं रोक रहा है। मैं अपने बहु-थ्रेडेड सी ++ प्रोग्राम पर कुछ विश्लेषण करने के लिए pthreads का उपयोग करने के लिए एम्बेडेड पावरपीसी लक्ष्य पर gdb 7.4.1 का उपयोग कर रहा हूं। मेरा अंतिम लक्ष्य कुछ सामान्य विश्लेषण कार्यों को स्वचालित करने के लिए पाइथन के साथ जीडीबी को स्क्रिप्ट करना है। समस्या यह है कि जब मैं एक जीडीबी उपयोगकर्ता परिभाषित कमांड में व्यक्तिगत रूप से बनाम आदेश चलाता हूं (या पाइथन लिपि के माध्यम से समान आदेशों का आह्वान करता हूं) तो मुझे व्यवहार में कुछ विसंगति मिल रही है।सी ++ धागा उपयोगकर्ता परिभाषित या पायथन कमांड अनुक्रम

संपादित करें: मुझे this मुख्य जीडीबी मेलिंग सूची पर एक बहुत ही समान समस्या का संदर्भ मिला। हालांकि मैं एसिंक मोड की सीमा के बारे में पेड्रो की प्रतिक्रिया का पूरी तरह से पालन नहीं करता हूं, मुझे लगता है कि वह यह कह रहा है कि एसिंक मोड में, उपयोगकर्ता द्वारा परिभाषित कमांड अनुक्रमों के सापेक्ष समय पर भरोसा नहीं किया जा सकता है। यही वह अनुभव है जो मैंने अनुभवपूर्वक पाया।

दोनों स्थितियों में, मैं प्रदर्शन निम्नलिखित शुरू हुआ कदम, मेरी प्रोग्राम लोड, अपने आर्ग की स्थापना, और अतुल्यकालिक और बिना रुके डिबगिंग मोड को चालू है, तो पृष्ठभूमि में कार्यक्रम चलाने:

(gdb) file myprogram 
(gdb) set args --interface=eth0 --try-count=0 
(gdb) set target-async on 
(gdb) set pagination off 
(gdb) set non-stop on 
(gdb) run & 

इस बिंदु पर, यदि मैं मैन्युअल रूप से interrupt और info threads आदेश जारी करता हूं, तो मुझे बंद किए गए सभी थ्रेडों की सूची दिखाई देती है। तो मैं continue & कर सकता हूं और अपने दिल की सामग्री को दोहरा सकता हूं, यह लगातार काम करता है। रुकने पर, मैं उस धागे के ढेर के फ्रेम का निरीक्षण कर सकता हूं और सब ठीक है।

हालांकि, अगर बजाय मैं एक उपयोगकर्ता परिभाषित gdb आदेश में इन आदेशों डाल:

(gdb) define foo 
(gdb) interrupt 
(gdb) info threads 
(gdb) continue & 
(gdb) end 
(gdb) foo 
Cannot execute this command while the selected thread is running. 

फिर धागा सूची foo द्वारा मुद्रित इंगित करता है कोई सूत्र बंद कर दिया गया है, और इसलिए continue & आदेश रिटर्न Cannot execute this command while the selected thread is running.। मुझे लगा कि यह अतुल्यकालिक gdb कमान करने के लिए एक समस्या निहित था, तो मैं बाधा आदेश के बाद एक मूर्खता से लंबे इंतजार डाला जाता है और समान व्यवहार हो गया है:

(gdb) define foo 
(gdb) interrupt 
(gdb) shell sleep 5 
(gdb) info threads 
(gdb) continue & 
(gdb) end 
(gdb) foo 
Cannot execute this command while the selected thread is running. 
के साथ या नींद आदेश के बिना

, मैं हमेशा पुस्तिका जारी कर सकते हैं सीएलआई आदेश और धागे सही ढंग से बंद हो जाते हैं। भले ही मैं gdb.execute कॉल में from_tty=True निर्दिष्ट

import gdb, time 

gdb.execute("file myprogram") 
gdb.execute("set args --interface=eth0 --try-count=0") 
gdb.execute("set target-async on") 
gdb.execute("set pagination off") 
gdb.execute("set non-stop on") 
gdb.execute("run &") 
time.sleep(5) 
gdb.execute("interrupt") 

# here, I inspect threads via gdb module interface 
# in practice, they're always all running bc the program neven got interrupted 
for thread in gdb.selected_inferior().threads(): 
    print thread.is_running(), 

gdb.execute("continue &") 

मैं एक ही परिणाम प्राप्त:

इसी तरह, मैं एक ही परिणाम एक अजगर स्क्रिप्ट सोर्सिंग धागा अवलोकन करने के लिए मिलता है। इसके अलावा, अगर मैं continue -a का उपयोग करता हूं तो यह त्रुटि स्ट्रिंग को दबाता है लेकिन अन्यथा बीसी में मदद नहीं करता है, तो इंटरप्ट कॉल अभी भी काम नहीं करता है।

  • कॉकपिट त्रुटि:

    तो ... यह है? क्या ऐसा कुछ है जिसे मैं छोड़ रहा हूं या गलत तरीके से कर रहा हूं, जो मैंने पूरा करने की कोशिश की है? क्या यह काम करना चाहिए, या क्या मुझे जीडीबी/एमआई को अतुल्यकालिक रूप से "ड्राइव" जीडीबी का उपयोग करना होगा?

  • एक समय की समस्या? हो सकता है कि इस संदर्भ में shell sleep (या python time.sleep()) जो मैं मानता हूं, वह नहीं करता है।
  • pthreads के उपयोग के साथ समस्या? मैंने माना है कि मैन्युअल gdb आदेशों का उपयोग करने से हमेशा सही तरीके से काम करता है यह मामला नहीं है।
  • एक जीडीबी समस्या?

धन्यवाद।

उत्तर

0

मुझे लगता है कि यह संभवतः एक जीडीबी समस्या है। मैं कम नियंत्रण वाले सामानों के बारे में अधिक आत्मविश्वास के बारे में पर्याप्त नहीं जानता। मुझे पता है कि कम नियंत्रण आमतौर पर पायथन तक नहीं चलाया गया है ...

कोशिश करने लायक एक चीज़ एक अलग पायथन धागा है जो इंतजार करता है, फिर जीडीबी का उपयोग कर मुख्य जीडीबी थ्रेड में "इंटरप्ट" कमांड भेजता है ।घटना के बाद।

फिर, "इंटरप्ट" के बाद थ्रेड की जांच करने या काम करने की बजाय, अपने कार्यों को ट्रिगर करने के लिए gdb.events.stop ईवेंट स्रोत का उपयोग करें।

कृपया पाइथन एपीआई में छेद के बारे में उदारतापूर्वक बग फाइल करें।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^