2012-03-23 27 views
20

मैं एसटीएम 32 एम्बेडेड सिस्टम के लिए सॉफ्टवेयर के इस टुकड़े को डीबग कर रहा हूं। ,कोई सेट ब्रेकपॉइंट्स के बावजूद सिगट्रैप; छुपा हार्डवेयर ब्रेकपॉइंट?

SIGTRAP, ट्रेस/ब्रेकप्वाइंट जाल

हालांकि, GDB में जब मैं info breakpoints कर रहा No breakpoints or watchpoints मिलती है: कार्यों में से एक में मेरे कार्यक्रमों ब्रेकप्वाइंट किसी प्रकार से टकराने रखता है। ब्रेकपॉइंट वास्तव में एक ब्रेकपॉइंट से मेल खाता है जिसे मैंने कुछ समय पहले निष्पादन योग्य के दूसरे संस्करण में सेट किया था। जब मैंने उस ब्रेकपॉइंट को सेट किया, तो जीडीबी ने मुझे automatically using a hardware breakpoint on read-only memory (या एक समान संदेश) बताया।

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

+0

सीपीयू रीसेट करें। :) (एचडब्ल्यू ब्रेकपॉइंट्स को छोड़ा जा सकता है, अगर जीडीबी मर जाता है या अगर यह बाहर निकलने/पुन: कनेक्शन पर सभी मौजूदा ब्रेकपॉइंट्स को हटा नहीं देता है)। – dbrank0

+0

ध्यान दें कि डीबग रजिस्ट्रार कुछ प्रकार के रीसेट में जारी रह सकते हैं। हालांकि एक पूर्ण पावर-ऑन रीसेट निश्चित रूप से इसे साफ़ करेगा। – TJD

+1

"पूर्ण पावर-ऑन रीसेट" से आपका क्या मतलब है? मैंने अनप्लगिंग/प्रतिलिपि बनाने की कोशिश की है, लेकिन ब्रेकपॉइंट बनी हुई है। – Randomblue

उत्तर

18

ठीक है। लंबा उत्तर: हार्डवेयर ब्रेकपॉइंट आमतौर पर कुछ विशेष CPU रजिस्टरों को लिखकर सेट किए जाते हैं। यह जीडीबी द्वारा किया जाता है। अगर जीडीबी मर जाता है, तो यह उन सीपीयू में स्थापित हो सकता है। मुझे लगता है कि आपका कार्यान्वयन (जीडीबी) उन लोगों को स्पष्ट या जांच नहीं करता है, जब यह आपके लक्ष्य से जुड़ता है। उन्हें ढूंढने के लिए, आपको अपने सीपीयू पर हार्डवेयर ब्रेकपॉइंट रजिस्टरों की सामग्री सूचीबद्ध करने की आवश्यकता होगी (यह नहीं पता कि एसटीएम 32 पर इसे कैसे करें)। वर्कअराउंड (सूचित अनुमान) होगा: जीडीबी का उपयोग करके कुछ एचडब्ल्यू ब्रेकपॉइंट्स (आमतौर पर केवल कुछ ही, शायद ही कभी कुछ हैं) सेट करें, फिर उन सभी को हटा दें। इसे ओवरराइट करना चाहिए और फिर उन एचडब्ल्यू रजिस्टरों को साफ करना चाहिए। एक बार जब आप उन ब्रेकपॉइंट्स (उन्हें हटाने से पहले) सेट करते हैं, तो "जारी रखें" (बस मामले में, क्योंकि gdb केवल उस समय ब्रेकपॉइंट सेट करता है)।

+1

में कुछ होना चाहिए, कई ब्रेकपॉइंट्स सेट करने के विचार के लिए धन्यवाद, और फिर उन्हें हटा देना। इससे समस्या का समाधान होना चाहिए। थोड़ा कष्टप्रद है कि जीडीबी उन ब्रेकपॉइंट्स को साफ़ नहीं करता है जब यह मेरे लक्ष्य से जुड़ता है। – Randomblue

1

कोड आप चल रहे हैं

int $0x03 ; talking about x86, don't know STM32 mnemo 

जो एक SIGTRAP invokes हो सकती है।

2

सिगट्रैप एक ब्रेकपॉइंट निर्देश होना चाहिए जो चल रहा है।

अपने निर्देश सूचक का निरीक्षण करके इसे डीबग करें, यह संभवतः उस पते पर इंगित किया गया है जिसमें बीकेपीटी निर्देश शामिल है (आपको देखना होगा कि वास्तविक कोड क्या है)।

वहां से आपको स्टैक और निर्देश पॉइंटर के आधार पर पीछे की ओर काम करना होगा और देखें कि आप कहां हैं। जीडीबी से ब्रेकपॉइंट निर्देश डालने से कई चीजें हो सकती हैं, जो भ्रष्टाचार को याद करने में विफल रहीं।

2

निम्नलिखित मुझे मदद मिली:

# Ones I hit the SIGTRAP: 
(gdb) f 0 # Show the current stack frame of the current thread. 
#0 0x4003ed70 in [email protected]@GLIBC_2.4() from /opt/CodeSourcery/arm-2011.09/arm-none-linux-gnueabi/libc/lib/libpthread.so.0 

# The fragment of interest is the current address: 0x4003ed70. 
# Set the hardware assisted breakpoint at the current address: 
(gdb) hbreak *0x4003ed70 

# Continue execution (without hitting SIGTRAP): 
(gdb) c 
# Continuing. 
+1

यह स्वीकार्य उत्तर के समान विचार है, लेकिन यह ध्यान रखना अच्छा है कि हैकबैक कमांड कुंजी है। सामान्य ब्रेक कमांड पिछले ब्रेकपॉइंट्स को ओवरराइट करने के बजाए सॉफ़्टवेयर ब्रेकपॉइंट्स सेट करेगा –

0

हैं जोड़ने और हार्डवेयर breakpoints को दूर करने में मदद नहीं करता, बाधा वेक्टर की जाँच करें।

कॉर्टेक्स-एम माइक्रोकंट्रोलर पर सभी हैंडलर प्रविष्टियों में एक विषम पता होना चाहिए (ARM Cortex-M FAQ)। यदि वे नहीं करते हैं, तो उपयोग का एक उपयोगफॉल्ट इन्वेस्टेट ट्रिगर किया गया है और एमसीयू रुक गया है। जीडीबी इसे एक सिगैबर्ट के रूप में व्याख्या करता है।

प्रविष्टियों में से एक एक और भी पता है, तो जाँच हैंडलर समारोह .thumb_func और .type निर्देशों (NXP Avoid hardfault, HardFault and .thumb_func) है, तो।एक HardFault_Handler के लिए

उदाहरण:

.thumb_func 
.type HardFault_Handler, %function 
HardFault_Handler: 
    TST LR, #4 
    ITE EQ 
    MRSEQ R0, MSP 
    MRSNE R0, PSP 
    B hard_fault_handler_c