c - Understanding this erratic behavior in gdb -


निम्न कोड पर विचार करें:

  #include & lt; stdio.h & gt; # शामिल करें & lt; ctype.h & gt; चार * Mstrupr (चार * szCad); Int main () {char szcadena [] = "यह स्ट्रिंग अच्छी तरह से प्रिंट करनी चाहिए।"; Printf ("% s \ n", मेस्ट्राप्रर (एसजेडैडेना)); Printf ("% s \ n", Mstrupr ("यह स्ट्रिंग विफल होनी चाहिए।")); वापसी 0; } चार * Mstrupr (चार * szCad) {int i; के लिए (i = 0; szcad [i]; i ++) szcad [i] = टूपर (szcad [i]); वापसी szCad; }  

Mstrupr को दूसरे कॉल को लिनक्स पर सही ढंग से चलाने में विफल रहता है क्योंकि यह स्ट्रिंग को एक शाब्दिक (और एक चार सरणी के रूप में नहीं) प्राप्त करता है जब पूरा प्रोग्राम जीडीबी पर चलाया जाता है तो यह भी असफल रहता है, लेकिन जब ब्रेकपॉइंट को मुख्य में जोड़ा जाता है और प्रोग्राम जीडीबी के अगले कमांड के जरिये चलाया जाता है, तो दूसरा स्ट्रिंग कैपिटलाइज और प्रिंट होता है। क्यों? मेरा मानना ​​है कि यह नहीं होना चाहिए, लेकिन मेरे प्रशिक्षक का कहना है कि यह जीडीबी के डिजाइन का हिस्सा है।

मुझे नहीं लगता कि gdb के डिज़ाइन का यह हिस्सा है। यह एक आकस्मिक पक्ष प्रभाव की तरह लगता है; जीडीबी ने कोड खंड लिखने योग्य बना दिया जब ब्रेकपॉइंट सेट किया गया था, इसलिए आपका कोड जो लिखेक्स को ओवरराइट करता है, वहां अब काम करता है

वास्तव में कोई डिबगर डिजाइनर जानबूझकर अपने डीबगर को किसी प्रोग्राम के व्यवहार को बदल नहीं सकता है; जो वास्तव में कठिन डीबगिंग करता है


Comments