2014-04-01 4 views
9

std::unique_ptr अच्छे हैं, लेकिन मैं उन्हें कम आरामदायक जब DDD या gdb में डीबगिंग पाते हैं।डीडीडी (या जीडीबी) में unique_ptr के साथ सी ++ 11 कोड डीबग कैसे करें?

मैं gdb सुंदर प्रिंटर कि जीसीसी का हिस्सा है (जैसे, /usr/share/gcc-4.8.2/python/libstdcxx/v6/printers.py) कर रहे हैं का उपयोग कर रहा हूँ। यही कारण है कि पठनीयता के लिए एक बड़ी जीत, उदाहरण के लिए है:

$ print pTest 
std::unique_ptr<MyType> containing 0x2cef0a0 
हालांकि

, सूचक dereferencing काम नहीं करता है:

$ print *pTest 
Could not find operator*. 

जब मैं मूल्य का उपयोग करने की जरूरत है, मैं मैन्युअल रूप से सूचक कॉपी करने के लिए है और , सही प्रकार पर यह डाली उदाहरण के लिए:

print *((MyType*) 0x2cef0a0) 

तो प्रक्रिया अभी भी चल रहा है, इस संस्करण में काम करता है (अभी भी बदसूरत लेकिन बेहतर):

print *pTest.get() // will not work if analyzing a core dump 

DDD में Display *pTest को स्पष्ट दृष्टिकोण या तो काम नहीं करता। यह केवल निम्न त्रुटि में परिणाम है:

<error: Could not find operator*.> 

वहाँ (कार्यप्रवाह की तरह मैं अपने बोझिल समाधानों के साथ क्या तोड़ने के बिना) DDD में unique_ptr साथ सी ++ 11 कोड डिबग करने के लिए कोई तरीका है?


मुझे gdb कमांड का उपयोग करने से डर नहीं है, लेकिन डीडीडी एकीकरण एक प्लस होगा। उदाहरण के लिए, डेटा संरचनाओं में केवल पॉइंटर्स केवल डबल-क्लिक करके टाइपिंग से अक्सर तेज़ होते हैं।

मैं पहले से ही बहुत प्रिंटर छोड़ने का प्रयास किया, लेकिन यह भी इष्टतम नहीं है।

print pTest._M_t->_M_head_impl 
+0

एक गूंगा सवाल की तरह लग सकता है, लेकिन आप का निर्माण करने के था स्क्रैच से आपके बॉक्स पर जीसीसी कंपाइलर? या यह एक आरपीएम अपडेट था? कुछ सी ++ 11 कोड डीबग करने का प्रयास करते समय मुझे हाल ही में जीडीबी के साथ कोई समस्या थी, और पाया कि मैं जीडीबी को फिर से संकलित नहीं करूंगा। मुझे पूरा यकीन है कि यहां मामला नहीं है, लेकिन मैंने सोचा कि यह पूछने लायक हो सकता है। – Welshboy

+0

@Welshboy मैं वर्तमान में आधिकारिक जीसीसी 4.8.2 (20140206) और जीडीबी 7 का उपयोग कर रहा हूं।आर्क लिनक्स से 7। –

+1

आप इसे आजमा सकते हैं: http://stackoverflow.com/questions/322322/displaying-Dereferenced-stl-iterators-in-gdb और विशेष रूप से एक gdbinit फ़ाइल पर एक नज़र डालें। ऐसा लगता है कि आप बहुत सी कस्टम चीजें हैं जो आप जीडीबी कर सकते हैं। सौभाग्य। – Ben

उत्तर

7

यह समस्या वास्तव में करने के लिए सी ++ 11, unique_ptr या सुंदर मुद्रण संबंधित नहीं है: सबसे अच्छा है कि मैं के साथ आ सकता है निम्नलिखित है। समस्या यह है कि जीसीसी std :: unique_ptr :: ऑपरेटर * के लिए कोड उत्सर्जित नहीं करता है जिसे gdb द्वारा unique_ptr को कम करने के लिए कहा जा सकता है। उदाहरण के लिए यदि आप अपने कोड में *pTest; जोड़ते हैं तो gdb dereferencing निष्पादित करता है।

ऐसा ही एक समस्या अतः पोस्ट How to `print`/evaluate c++ template functions in gdb में वर्णित है। https://sourceware.org/ml/archer/2012-q1/msg00003.html पर auto_ptr के लिए लगभग एक ही समस्या का वर्णन किया गया है। अगर मैं धागे को सही ढंग से समझता हूं तो एक वर्कअराउंड सुंदर प्रिंटर को पैच करना होगा और अनन्य_प्टर प्रिंट करते समय डीरेन्फर किए गए पॉइंटर को प्रिंट करना होगा। एक जीडीबी बग रिपोर्ट http://sourceware.org/bugzilla/show_bug.cgi?id=12937 पर पाई जा सकती है।

https://sourceware.org/gdb/wiki/STLSupport पर gdb विकि अधिक सुंदर मुद्रण समाधान है, जो अन्य समाधान हो सकता था वर्णन करता है।

संपादित करें: एक और अधिक सुरुचिपूर्ण समाधान ऑपरेटर * सहित स्पष्ट रूप से वर्ग का दृष्टांत को है सभी सदस्य टेम्पलेट्स के लिए कोड फेंकना संकलक के लिए मजबूर:

template class std::unique_ptr<MyType>; 
+0

मुझे इस स्पष्ट तत्कालता को कहां परिभाषित करना चाहिए? – q0987

+0

'मेमोरी' हेडर को शामिल करने के बाद और 'माईटाइप' (या संबंधित शामिल) की घोषणा के बाद आपकी अनुवाद इकाइयों ("सीपीपी फ़ाइल") में से एक में तकनीकी दृष्टि से तकनीकी दृष्टि से - http: //en.cppreference देखें .com/डब्ल्यू/सीपीपी/भाषा/class_template # Explicit_instantiation – user1225999

संबंधित मुद्दे