2010-11-15 15 views
119

क्या मैं निर्दिष्ट कर सकता हूं कि मैं जीडीबी को लाइन x पर तोड़ना चाहता हूं जब char* x अंक एक स्ट्रिंग पर है जिसका मान "hello" के बराबर है? यदि हां, तो कैसे?मैं gdb में सशर्त ब्रेकपॉइंट कैसे सेट करूं, जब char * x एक स्ट्रिंग को इंगित करता है जिसका मान "हैलो" के बराबर होता है?

+0

नोट: 'strncmp' और 'strstr' अन्य उपयोगी सी क्वेरी फ़ंक्शन हैं। –

उत्तर

153

आप strcmp उपयोग कर सकते हैं:

break x:20 if strcmp(y, "hello") == 0 

20 लाइन नंबर है, x किसी भी फ़ाइल नाम हो सकता है और y किसी भी चर हो सकता है।

+6

नोट: आपको पहले से ही प्रोग्राम चलाना होगा ताकि जीडीबी stdlib देखें। अन्यथा: वर्तमान संदर्भ में 'कोई प्रतीक नहीं "strcmp"। –

+0

@ naive231 "देखें" से मेरा मतलब था कार्यों को देखना ताकि आप उन्हें तोड़ सकें, स्रोत नहीं: आपको इसके लिए 'रन' हिट करना होगा ताकि गतिशील पुस्तकालय लोड हो जाएं। स्रोत के लिए, इसे Google पर खोजें और ढूंढें: http://stackoverflow.com/questions/10000335/how-to-use-debug-version-of-libc :-) –

39
break x if ((int)strcmp(y, "hello")) == 0 

कुछ कार्यान्वयन पर gdb स्ट्रैम्प के रिटर्न प्रकार को नहीं पता हो सकता है। इसका मतलब है कि आपको कास्ट करना होगा, अन्यथा यह हमेशा सत्य का मूल्यांकन करेगा! 'हर बार ब्रेकप्वाइंट मारा जाता है ढेर

$_memeq(buf1, buf2, length)` 
$_streq(str1, str2) 
$_strlen(str) 
$_regex(str, regex) 

काफी कम प्रक्रिया पर एक "विदेशी" strcmp() निष्पादित करने के लिए की तुलना में समस्याग्रस्त लगता है:

10

Since GDB 7.5 आप इन आसान Convenience Functions उपयोग कर सकते हैं।

नोट करें कि आपके जीडीबी को पायथन समर्थन के साथ संकलित करने की आवश्यकता है, जो मौजूदा लिनक्स डिस्ट्रोज़ के साथ कोई समस्या नहीं है। यह सुनिश्चित करने के लिए, आप show configuration को जीडीबी के अंदर चलाकर और --with-python खोजकर देख सकते हैं। इस छोटे oneliner चाल, भी करता है:

$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' 
      --with-python=/usr (relocatable) 

अपने प्रदर्शन के मामले के लिए, उपयोग

break <where> if $_streq(x, "hello") 
होगा

या, अपने ब्रेकप्वाइंट पहले से मौजूद है और तुम सिर्फ जोड़ना चाहते हैं यह करने के लिए शर्त

condition <breakpoint number> $_streq(x, "hello") 

$_streq केवल पूरे str से मेल खाता है आईएनजी, इसलिए यदि आप कुछ और चालाक चाहते हैं तो आपको $_regex का उपयोग करना चाहिए, जो Python regular expression syntax का समर्थन करता है।