2008-10-24 13 views
41

में <अपूर्ण प्रकार> चर मुद्रित करने के लिए कैसे करें कभी-कभी gdb कुछ प्रकार के चर के लिए "अपूर्ण प्रकार" प्रिंट करता है। इसका क्या अर्थ है और हम उस मूल्य को कैसे देख सकते हैं?जीडीबी

उत्तर

28

इसका मतलब है कि उस चर के प्रकार को अपूर्ण रूप से निर्दिष्ट किया गया है। उदाहरण के लिए:

struct hatstand; 
struct hatstand *foo; 

GDB जानता है कि foo एक hatstand संरचना करने के लिए एक सूचक है, लेकिन है कि संरचना के सदस्यों परिभाषित नहीं किया गया है। इसलिए, "अपूर्ण प्रकार"।

मूल्य मुद्रित करने के लिए, आप इसे एक संगत प्रकार में डाल सकते हैं।

उदाहरण के लिए

, यदि आप जानते हैं कि foo वास्तव में एक lampshade संरचना करने के लिए एक सूचक है:

print (struct lampshade *)foo 

या, आप एक सामान्य सूचक के रूप में इसे प्रिंट, या यह इलाज हो सकता है जैसे कि यह एक पूर्णांक थे:

print (void *)foo 
print (int)foo 

भी देखें GDB पुस्तिका से इन पृष्ठों:

+0

अच्छा जवाब, हालांकि लिंक 404 हैं। –

+1

फिक्स्ड। याद नहीं कर सकते कि वे पहले से क्या लिंक कर रहे थे, लेकिन इन दो लिंक सहायक होना चाहिए :)। –

5

मैं क्या पाया है कि यदि आप एक समारोह अधूरा struct प्रकार gdb का उपयोग करता है एकत्रित न struct सदस्यों के पता चलता है 'और बाद में उन्हें प्रदर्शित कर सकते हैं।

struct my_string { 
    char * _string, 
    int _size 
} ; 

कुछ कार्यों बना सकते हैं और सूचक के माध्यम से प्राप्त करने के लिए स्ट्रिंग:

int main(int argc, char *argv[]) { 
    my_string *str = create_string("Hello World!") ; 
    printf("String value: %s\n", get_string(str)) ; 
    ... 
} 

:

my_string * create_string(const char *) {...} 
const char * get_string(my_string *){...} 

और एक परीक्षण है कि एक स्ट्रिंग बनाता है उदाहरण के लिए, आप एक तार struct है कहना इसे जीडीबी में चलाएं और 'प्रिंट * स्ट्र' करने का प्रयास करें और आपको 'अधूरा प्रकार' प्रतिक्रिया मिलेगी। हालांकि, 'get_string को अलग करें' और फिर 'प्रिंट * str' को आज़माएं और यह संरचना और मानों को सही तरीके से प्रदर्शित करेगा। मुझे नहीं पता कि यह क्यों काम करता है, लेकिन यह करता है।

0

मुझे एक ही समस्या थी। यदि आप स्वयं अपनी पुस्तकालयों से प्रतीक लोड हैं:

set auto-solib-add off 
attach thread_id 
shared any_lib 
shared another_lib 

आप पुस्तकालय है, जहां इस वस्तु एक ही कमांड के साथ घोषित किया जाता है, साथ ही से प्रतीकों लोड करने के लिए की जरूरत है।

0

मुझे त्रुटि का पूरा अर्थ नहीं पता है, लेकिन जैसा कि पीटर नोट करता है, संबंधित विधि के डिस्सेप्लर ऐसा कुछ करता है जो इनमें से कुछ प्रकार की परिभाषाओं को उपलब्ध कराता है।

मेरे उदाहरण:

एक वर्ग के लिए ज में, उस वर्ग एक आंतरिक सहायक वर्ग के एक आगे घोषणा शामिल थे ताकि बाहरी वर्ग इसे करने के लिए एक सूचक हो सकता है। इसी .cpp में पूर्ण आंतरिक सहायक वर्ग परिभाषा थी।

बाहरी वर्ग की एक विधि में तोड़ने पर, जीडीबी ने बाह्य वर्ग के उदाहरण के माध्यम से आंतरिक वर्ग के उदाहरण के लिए सूचक के अपूर्णता के लिए अपूर्ण प्रकार की सूचना दी।

बाहरी वर्ग में विधियों में से एक पर डिस्सेबल कमांड जारी करने से पहले एक ही सूचक का उपयोग करके आंतरिक कक्षा की संरचना को समझने के लिए जीडीबी को अनुमति दी गई थी।