जवाबों:
आप उपयोग कर सकते हैं strcmp:
break x:20 if strcmp(y, "hello") == 0
20लाइन नंबर है, xकोई भी नाम yहो सकता है और कोई भी चर हो सकता है।
No symbol "strcmp" in current context.
runकरना होगा ताकि गतिशील लाइब्रेरी लोड हो जाएं। स्रोत के लिए, इसे गूगल करें और खोजें: stackoverflow.com/questions/10000335/… :-)
$_streq@tlwhitec से विधि बेहतर है।
break x if ((int)strcmp(y, "hello")) == 0
कुछ कार्यान्वयन पर gdb को strcmp का रिटर्न प्रकार नहीं पता हो सकता है। इसका मतलब है कि आपको कास्ट करना होगा, अन्यथा यह हमेशा सच का मूल्यांकन करेगा!
GDB 7.5 के बाद से आप इन मूल सुविधा का उपयोग कर सकते हैं :
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
strcmp()ब्रेकपॉइंट हिट होने पर हर बार प्रक्रिया के स्टैक पर "विदेशी" निष्पादित करने की तुलना में काफी कम समस्याग्रस्त लगता है। यह मल्टीथ्रेडेड प्रक्रियाओं को डीबग करने के लिए विशेष रूप से सच है।
ध्यान दें कि आपके जीडीबी को पायथन समर्थन के साथ संकलित करने की आवश्यकता है, जो कि मौजूदा लिनक्स डिस्ट्रोस के साथ कोई समस्या नहीं है। सुनिश्चित करने के लिए, आप इसे
show configurationGDB के अंदर चलाकर और खोज कर देख सकते हैं--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केवल पूरे स्ट्रिंग से मेल खाता है, इसलिए यदि आप कुछ अधिक चालाक चाहते हैं $_regex, जिसका आपको उपयोग करना चाहिए , जो पायथन नियमित अभिव्यक्ति सिंटैक्स का समर्थन करता है ।
strncmpऔरstrstrअन्य उपयोगी सी क्वेरी फ़ंक्शन हैं।