जवाबों:
आप उपयोग कर सकते हैं 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 configuration
GDB के अंदर चलाकर और खोज कर देख सकते हैं--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
अन्य उपयोगी सी क्वेरी फ़ंक्शन हैं।