मैं gdb में सशर्त ब्रेकपॉइंट कैसे सेट करूं, जब char*x एक स्ट्रिंग को इंगित करता है जिसका मान "हैलो" के बराबर होता है?




debugging conditional-breakpoint (2)

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

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

20 लाइन संख्या है, x कोई फ़ाइल नाम हो सकता है और y कोई चर हो सकता है।

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


चूंकि जीडीबी 7.5 आप इन सुविधाजनक सुविधा कार्यों का उपयोग कर सकते हैं:

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

प्रक्रिया पर "विदेशी" strcmp() निष्पादित करने की तुलना में काफी कम समस्याग्रस्त लगता है, प्रत्येक बार ब्रेकपॉइंट मारा जाता है।

ध्यान दें कि आपके जीडीबी को पायथन समर्थन के साथ संकलित करने की आवश्यकता है, जो मौजूदा लिनक्स डिस्ट्रोज़ के साथ कोई समस्या नहीं है। यह सुनिश्चित करने के लिए, आप इसे जीडीबी के अंदर 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 केवल पूरी स्ट्रिंग से मेल खाता है, इसलिए यदि आप कुछ और चालाक चाहते हैं तो आपको $_regex उपयोग करना चाहिए, जो पायथन नियमित अभिव्यक्ति वाक्यविन्यास का समर्थन करता है।





conditional-breakpoint