मैं अपने (सी ++) प्रोग्राम के निष्पादन के किसी बिंदु पर बैकट्रैक प्राप्त करने का प्रयास कर रहा हूं।स्टैकट्रैक और नामस्थानों में फ़ंक्शंस
इसके लिए मैं बैकट्रैक और बैकट्रैक_सिम्बोल्स का उपयोग कर रहा हूं। इस लाइन के साथ कुछ:
std::string stacktrace(unsigned int frames_to_skip)
{
std::string str;
void* stack_addrs[50];
int trace_size = backtrace(stack_addrs, 50);
char** stack_strings = backtrace_symbols(stack_addrs, trace_size);
str += "[bt] backtrace:\n";
// skip frames_to_skip stack frames
for(int i = frames_to_skip; i < trace_size; ++i)
{
char tmp[4096];
sprintf(tmp, "[bt] #%d %s\n", i-frames_to_skip, stack_strings[i]);
str += tmp;
}
free(stack_strings);
return str;
}
यह काम करता है लेकिन कुछ फ़ंक्शन नाम गायब हैं। उदाहरण:
[bt] #0 /path/to/executable() [0x43e1b5]
[bt] #1 /path/to/executable() [0x43e0cd]
[bt] #2 /path/to/executable() [0x43df51]
[bt] #3 /path/to/executable() [0x43dd44]
[bt] #4 /path/to/executable() [0x43db50]
[bt] #5 /path/to/executable() [0x43d847]
[bt] #6 /path/to/executable() [0x43d216]
[bt] #7 /path/to/executable() [0x43c1e1]
[bt] #8 /path/to/executable() [0x43b293]
[bt] #9 /path/to/executable(_Z29SomeRN5other8symbolE+0x2c) [0x43a6ca]
[bt] #10 /path/to/executable(_Z11SomeIN5_8symbolEPFvRS1_EEvRKT_RKT0_+0x77) [0x441716]
...
कार्यों 0 से 8 एक आम बात है: वे सभी एक नाम स्थान में बैठते हैं ...
मैं एक गुमनाम नाम स्थान में (किसी अन्य संशोधन के बिना) समारोह 9 डालने की कोशिश की और इसे से disapears बैकट्रैक ... जो अब इस तरह दिखता है:
[bt] #0 /path/to/executable() [0x43e1b5]
[bt] #1 /path/to/executable() [0x43e0cd]
[bt] #2 /path/to/executable() [0x43df51]
[bt] #3 /path/to/executable() [0x43dd44]
[bt] #4 /path/to/executable() [0x43db50]
[bt] #5 /path/to/executable() [0x43d847]
[bt] #6 /path/to/executable() [0x43d216]
[bt] #7 /path/to/executable() [0x43c1e1]
[bt] #8 /path/to/executable() [0x43b293]
[bt] #9 /path/to/executable() [0x43a6ca]
[bt] #10 /path/to/executable(_Z11SomeIN5_8symbolEPFvRS1_EEvRKT_RKT0_+0x77) [0x441716]
...
क्या इसे ठीक करने का कोई तरीका है?
पुनश्च: ++ जी के संस्करण: जी ++ (जीसीसी) 4.6.0 20,110,530 (रेड हैट 4.6.0-9)
संपादित कोड बंदर टिप्पणी के बाद पश्व-अनुरेखन की अधिकतम गहराई तय
EDIT2 समारोह
edit3 कोड -O0 -g3 साथ संकलित और -rdynamic
हैलो, आपके उत्तर के लिए धन्यवाद।आप अधिकतम गहराई के बारे में सही हैं, बैकट्रैस का अंत गुम था, लेकिन यह कोई समस्या नहीं है क्योंकि उन लापता कॉल परीक्षण फ्रेमवर्क से हैं जो मैं उपयोग कर रहा हूं। फिर भी, समस्या बनी हुई है और मैं ब्लॉग पोस्ट के समान ही कर रहा हूं। एक दिलचस्प तथ्य हालांकि, टेस्ट फ्रेमवर्क में नेमस्पेस में फ़ंक्शन हैं और वे स्टैकट्रैस में दिखाई दे रहे हैं, मेरे फ़ंक्शन नहीं हैं ... मैंने फिर से टेस्ट किया था (एक नामस्थान में फ़ंक्शन डालना), और फिर से वही काम किया गया (फ़ंक्शन बैकट्रैक में अब दिखाई नहीं दे रहा है ... – foke