2015-04-10 7 views
11

मैं C++11 सॉफ़्टवेयर लिख रहा हूं और मैं लैम्बडा का उपयोग कर रहा हूं। जब मैं backtrace_symbols_fd के साथ बैकट्रैक प्रिंट करता हूं तो सभी कार्यों को लैम्ब्डा को छोड़कर ध्वस्त कर दिया जाता है। यह थोड़ा स्पष्ट है क्योंकि वे अज्ञात कार्य हैं, लेकिन कच्चे सूचक के बजाय अधिक अंतर्दृष्टि प्राप्त करने का कोई तरीका है?मैं बैकट्रैस पर लैम्ब्डा फ़ंक्शंस कैसे दिखा सकता हूं?

मैं जीसीसी 4.8 उपयोग कर रहा हूँ लिनक्स

+2

यह संदर्भ में उपयोगी है कि कौन सा संदर्भ (डीबगर? टूलचेन?) आप इसे देखना चाहते हैं। – MSalters

+0

हां, आप किस कंपाइलर और डीबगर का उपयोग कर रहे हैं? – LThode

+0

@MSalters किया गया, धन्यवाद –

उत्तर

0

पर सी ++ मानक के अनुसार:

§5.1.2/3 राज्यों:

लैम्ब्डा अभिव्यक्ति के प्रकार (जो क्लोजर ऑब्जेक्ट का प्रकार) एक अद्वितीय, अज्ञात गैर-यूनियन क्लास प्रकार है।

मुझे नहीं लगता कि अधिक उपयोगी जानकारी प्राप्त करने का एक तरीका है। असल में, लैम्बडास अज्ञात वर्गों के उदाहरण हैं।

+0

उन्हें अभी भी किसी प्रकार का नाम चाहिए, लिंकिंग और नाम मैंगलिंग उद्देश्यों के लिए, भले ही उस नाम को उपयोगकर्ताओं द्वारा नहीं कहा जा सके। जैसे यदि आप एक बंदरगाह प्रकार के साथ टेम्पलेट को तत्काल बनाते हैं तो संकलक को टेम्पलेट विशेषज्ञता के उलझन वाले नाम में बंद प्रकार को एन्कोड करने की आवश्यकता होती है। –

2

बाइनरी में कुछ प्रकार की उपयोगी जानकारी मौजूद है, क्योंकि जीडीबी लैम्ब्डा कार्यों के लिए अधिक उपयोगी नाम दिखाने में सक्षम है।

(gdb) bt 
#0 <lambda()>::operator()(void) const (__closure=0x7fffffffd5ef) at ll.cc:3 
#1 0x00000000004005e7 in main() at ll.cc:3 

को बंद करने के प्रकार के साथ instantiated एक टेम्पलेट के घायल नाम का एक अलग नाम जैसे भी शामिल है (हालांकि शायद डिबग जानकारी बस, एक बंद प्रकार है के रूप में GDB <lambda()>::operator() के रूप में सभी तरह के कार्यों से पता चलता कहते हैं)

#3 0x0000000000400712 in func<main()::<lambda()> >(<lambda()>) (t=...) at l.cc:4 

लेकिन शायद नाम केवल तभी उपयोग किया जाता है जब इसे अन्य उलझन वाले नामों में जरूरी हो।

जीसीसी के साथ आप भी मुद्रण द्वारा बंद के operator() का नाम प्रिंट कर सकते हैं पूर्व निर्धारित चर __PRETTY_FUNCTION__, जो main()::<lambda()>

GDB के अजगर API का उपयोग करना मैं एक ही बंद करने के लिए अभी तक एक और नाम प्राप्त कर सकते हैं की तरह कुछ पता चलता है, जैसे

(gdb) python import gdb; print gdb.block_for_pc(0x8048591).function.name 
__lambda0::operator()() const 

तो यह कम से कम तीन अलग-अलग नाम हैं! तो मुझे लगता है कि यह शायद backtrace_symbols_fd की सीमा है कि इसे लैम्ब्डा कार्यों के लिए नाम नहीं मिल रहे हैं।

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