Tôi đang cố gắng để có được một backtrace tại một số điểm của việc thực hiện của tôi (c + +) chương trình.stacktrace và chức năng trong không gian tên
cho rằng tôi đang sử dụng backtrace và backtrace_symbols. Một cái gì đó dọc theo dòng này:
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;
}
Nó hoạt động nhưng một số tên hàm bị thiếu. Ví dụ:
[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]
...
chức năng 0-8 có một điểm chung: họ đều ngồi trong một không gian tên ...
Tôi đã thử đưa chức năng 9 trong một không gian tên vô danh (không có bất kỳ thay đổi khác) và nó disapears từ backtrace ... trông giống như sau:
[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]
...
Có cách nào khắc phục điều đó không?
ps: phiên bản của g ++: g ++ (GCC) 4.6.0 20.110.530 (Red Hat 4.6.0-9)
chỉnh sửa cố định chiều sâu tối đa của vết lùi sau Mã Khỉ xét
edit2 thêm mã đầy đủ các chức năng
EDIT3 mã được biên dịch với -O0 -g3 và liên kết với -rdynamic
xin chào, cảm ơn câu trả lời của bạn.bạn đúng về độ sâu tối đa, phần cuối của backtrace bị thiếu, nhưng đó không phải là vấn đề vì những cuộc gọi bị thiếu đó là từ khung kiểm tra mà tôi đang sử dụng. Tuy nhiên, vấn đề vẫn còn và tôi đang làm giống như bài đăng trên blog nói. Tuy nhiên, một thực tế thú vị là khung công tác có các hàm trong các không gian tên và chúng có thể nhìn thấy trong stacktrace, các chức năng của tôi không ... Tôi đã thực hiện lại kiểm tra (đặt một hàm trong một không gian tên). không còn nhìn thấy trong backtrace ... – foke