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


164

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


नोट: strncmpऔर strstrअन्य उपयोगी सी क्वेरी फ़ंक्शन हैं।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '

जवाबों:


198

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

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

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


9
नोट: आपको प्रोग्राम पहले से ही चलाना चाहिए ताकि GDB stdlib को देख सके। वरना:No symbol "strcmp" in current context.
Ciro Santilli 郝海东

1
@CiroSantilli 六四 ill ill 卓 轩 How: stdlib को देखने के लिए gdb को कैसे कॉन्फ़िगर करें?
naive231

@ naive231 "देखें" से मेरा मतलब है कि आप कार्य देख सकते हैं ताकि आप उन पर टूट सकें, न कि स्रोत: आपको इसके लिए हिट runकरना होगा ताकि गतिशील लाइब्रेरी लोड हो जाएं। स्रोत के लिए, इसे गूगल करें और खोजें: stackoverflow.com/questions/10000335/… :-)
Ciro Santilli 病 六四 and and 事件

1
इस विधि के दुष्प्रभाव हो सकते हैं। $_streq@tlwhitec से विधि बेहतर है।
rools

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

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


46

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, जिसका आपको उपयोग करना चाहिए , जो पायथन नियमित अभिव्यक्ति सिंटैक्स का समर्थन करता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.