[Debugging] क्या मैं जीडीबी में 'मेमोरी एक्सेस' पर ब्रेकपॉइंट सेट कर सकता हूं?


Answers

पहला जवाब (char *)(0x135700 +0xec1a04f) सी-जैसे वाक्यविन्यास (char *)(0x135700 +0xec1a04f) का जिक्र कर रहा है, तो rwatch *0x135700+0xec1a04f का उत्तर गलत है। सही वाक्यविन्यास rwatch *(0x135700+0xec1a04f)

() की कमी ने मुझे घड़ी के बिंदुओं का उपयोग करने की कोशिश कर दर्द का एक बड़ा सौदा किया।

Question

मैं जीडीबी के माध्यम से एक एप्लीकेशन चला रहा हूं और मैं किसी भी समय एक विशिष्ट चर का उपयोग / परिवर्तित होने के लिए ब्रेकपॉइंट सेट करना चाहता हूं। क्या ऐसा करने के लिए कोई अच्छी विधि है? सी / सी ++ में एक चर को मॉनीटर करने के अन्य तरीकों में भी दिलचस्पी होगी, यह देखने के लिए कि क्या यह बदलता है या नहीं।




यह देखने के लिए घड़ी का उपयोग करें कि एक चर लिखा गया है, जब इसे पढ़ा जाता है और जब इसे पढ़ा / लिखा जाता है, तब से रवाना होता है जैसा ऊपर बताया गया है। हालांकि, कृपया ध्यान दें कि इस कमांड का उपयोग करने के लिए, आपको प्रोग्राम को तोड़ना होगा, और जब आप प्रोग्राम को तोड़ते हैं तो वेरिएबल स्कोप में होना चाहिए:

घड़ी कमांड का प्रयोग करें। घड़ी कमांड का तर्क एक अभिव्यक्ति है जिसका मूल्यांकन किया जाता है। इसका तात्पर्य यह है कि वे वैरिएबल जिसे आप वॉचपॉइंट सेट करना चाहते हैं, वर्तमान दायरे में होना चाहिए। इसलिए, गैर-ग्लोबल वैरिएबल पर एक वॉचपॉइंट सेट करने के लिए, आपको एक ब्रेकपॉइंट सेट करना होगा जो चर के दायरे में आपके प्रोग्राम को रोक देगा। प्रोग्राम ब्रेक के बाद आप घड़ी बिंदु सेट करते हैं।




मैंने बस निम्नलिखित की कोशिश की:

 $ cat gdbtest.c
 int abc = 43;

 int main()
 {
   abc = 10;
 }
 $ gcc -g -o gdbtest gdbtest.c
 $ gdb gdbtest
 ...
 (gdb) watch abc
 Hardware watchpoint 1: abc
 (gdb) r
 Starting program: /home/mweerden/gdbtest 
 ...

 Old value = 43
 New value = 10
 main () at gdbtest.c:6
 6       }
 (gdb) quit

तो ऐसा लगता है, लेकिन आपको कुछ हार्डवेयर समर्थन की आवश्यकता दिखाई देती है।