2010-09-27 12 views
5

निम्नलिखित कोड पर विचार करें: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 के अगले कमांड के माध्यम से चलाया जाता है, तो दूसरी स्ट्रिंग को कैपिटल और मुद्रित किया जाता है। क्यों? मुझे विश्वास है कि यह नहीं होना चाहिए, लेकिन मेरे प्रशिक्षक जोर देते हैं कि यह जीडीबी के डिजाइन का हिस्सा है।

उत्तर

9

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

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

+0

शायद यह कुछ ऐसा है जो gdb लोग बग पर विचार करेंगे। अधिकांश उपयोगों के लिए (कुछ एम्बेडेड वाले नहीं, हालांकि) जीडीबी को ब्रेक पॉइंट को लागू करने के लिए ब्रेक निर्देश डालने के लिए कोड बदलना होता है, जिसका अर्थ है कि इसे स्मृति के उस क्षेत्र को लिखने योग्य में बदलना है। यह स्पष्ट रूप से इसे अपनी पिछली सेटिंग्स में बदल नहीं रहा है। – nategoose

+0

यह वास्तव में अजीब बात है, खासकर जब से जीसीसी का मेरा संस्करण एक अलग सेगमेंट में रखता है, '.rodata' gdb – Hasturkun

1

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

+0

को स्पर्श करने का कोई कारण नहीं है gdb – pm100

+0

हां में एक निश्चित बग की तरह लगता है। मेरा मानना ​​है कि यह है। – andandandand