मुझे पता है कि हम मेमोरी तक पहुंचने और पढ़ने के लिए कई कमांड का उपयोग कर सकते हैं: उदाहरण के लिए, प्रिंट, पी, एक्स ...
लेकिन मैं किसी विशिष्ट स्थान पर (जीडीबी में डीबगिंग के दौरान) मेमोरी की सामग्री को कैसे बदल सकता हूं?
मुझे पता है कि हम मेमोरी तक पहुंचने और पढ़ने के लिए कई कमांड का उपयोग कर सकते हैं: उदाहरण के लिए, प्रिंट, पी, एक्स ...
लेकिन मैं किसी विशिष्ट स्थान पर (जीडीबी में डीबगिंग के दौरान) मेमोरी की सामग्री को कैसे बदल सकता हूं?
जवाबों:
सबसे आसान प्रोग्राम चर सेट कर रहा है ( GDB देखें : असाइनमेंट ):
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
या आप पता द्वारा मनमाने ढंग से (लेखन योग्य) स्थान अपडेट कर सकते हैं:
(gdb) set {int}0x83040 = 4
अभी और है। मैनुअल पढ़ें ।
set (str[6]) = 'c'
काम करता है, अगर आपके पास एक सरणी है, जैसेchar str[]
जैसा कि निकोलाई ने कहा है कि आप एक चर के मान को बदलने के लिए gdb 'सेट' कमांड का उपयोग कर सकते हैं।
आप मेमोरी स्थानों को बदलने के लिए 'सेट' कमांड का उपयोग कर सकते हैं। जैसे। निकोलाई के उदाहरण पर विस्तार:
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
(gdb) p &i
$2 = (int *) 0xbfbb0000
(gdb) set *((int *) 0xbfbb0000) = 20
(gdb) p i
$3 = 20
यह किसी भी वैध पॉइंटर के लिए काम करना चाहिए, और इसे किसी भी उपयुक्त डेटा प्रकार में डाला जा सकता है।
set {char[100]}(0x00) = ""
0x00 पर मेमोरी की 100 बाइट्स साफ़ करता है
यहां दिए गए उत्तरों पर विस्तार करना।
आप बस set idx = 1
एक चर सेट करने के लिए कर सकते हैं , लेकिन उस वाक्यविन्यास की अनुशंसा नहीं की जाती है क्योंकि चर नाम सेट उप-कमांड के साथ टकरा सकता है। एक उदाहरण के रूप में set w=1
मान्य नहीं होगा।
इसका मतलब है कि आपको सिंटैक्स पसंद करना चाहिए: set variable idx = 1
या set var idx = 1
।
अंतिम लेकिन कम से कम, आप अपने भरोसेमंद पुराने प्रिंट कमांड का उपयोग कर सकते हैं, क्योंकि यह एक अभिव्यक्ति का मूल्यांकन करता है। एकमात्र अंतर यह है कि वह अभिव्यक्ति के परिणाम को भी प्रिंट करता है।
(gdb) p idx = 1
$1 = 1
आप यहाँ gdb के बारे में अधिक पढ़ सकते हैं ।