निम्नलिखित कोड पर विचार करें:gdb में इस अनियमित व्यवहार को समझना
#include <stdio.h>
#include <ctype.h>
char* Mstrupr(char* szCad);
int main()
{
char szCadena[] = "This string should print well.";
printf("%s\n", Mstrupr(szCadena));
printf("%s\n", Mstrupr("This string should fail."));
return 0;
}
char* Mstrupr(char* szCad)
{
int i;
for (i=0; szCad[i]; i++)
szCad[i] = toupper(szCad[i]);
return szCad;
}
Mstrupr को दूसरी कॉल इसकी के रूप में स्ट्रिंग एक शाब्दिक (और नहीं एक चार सरणी के रूप में) प्राप्त करने के रूप लिनक्स पर सही ढंग से चलाने के लिए विफल रहता है। जब पूरा प्रोग्राम gdb पर चलाया जाता है तो यह भी विफल रहता है, लेकिन जब ब्रेकपॉइंट मुख्य में जोड़ा जाता है और प्रोग्राम gdb के अगले कमांड के माध्यम से चलाया जाता है, तो दूसरी स्ट्रिंग को कैपिटल और मुद्रित किया जाता है। क्यों? मुझे विश्वास है कि यह नहीं होना चाहिए, लेकिन मेरे प्रशिक्षक जोर देते हैं कि यह जीडीबी के डिजाइन का हिस्सा है।
शायद यह कुछ ऐसा है जो gdb लोग बग पर विचार करेंगे। अधिकांश उपयोगों के लिए (कुछ एम्बेडेड वाले नहीं, हालांकि) जीडीबी को ब्रेक पॉइंट को लागू करने के लिए ब्रेक निर्देश डालने के लिए कोड बदलना होता है, जिसका अर्थ है कि इसे स्मृति के उस क्षेत्र को लिखने योग्य में बदलना है। यह स्पष्ट रूप से इसे अपनी पिछली सेटिंग्स में बदल नहीं रहा है। – nategoose
यह वास्तव में अजीब बात है, खासकर जब से जीसीसी का मेरा संस्करण एक अलग सेगमेंट में रखता है, '.rodata' gdb – Hasturkun