내 (C++) 프로그램의 실행 중 일부 지점에서 백 트레이스를 얻으려고합니다.스택 추적 및 네임 스페이스의 함수
나는 backtrace 및 backtrace_symbols를 사용하고 있습니다. 이 줄의 어떤 것 :
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;
}
작동하지만 일부 기능 이름이 없습니다. 예를 들면 : 나는 (다른 수정없이) 익명의 네임 스페이스 기능 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(_Z29SomeRN5other8symbolE+0x2c) [0x43a6ca]
[bt] #10 /path/to/executable(_Z11SomeIN5_8symbolEPFvRS1_EEvRKT_RKT0_+0x77) [0x441716]
...
기능 0 8 하나 개의 공통 지점이 backtrace ... 이제 다음과 같이 보입니다 :
[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]
...
해결할 방법이 있습니까?
PS : ++ g 버전 : g ++ (GCC) 4.6.0 20110530 (레드햇 4.6.0-9) 코드 원숭이의 발언 후 역 추적의 최대 깊이를 고정
편집
EDIT2
EDIT3 코드가 -O0 -g3 컴파일하고 사용하는 기능을 할 수있다 -rdynamic
안녕하세요, 귀하의 답변에 감사드립니다.당신은 최대 깊이에 대해 옳았습니다. 백 트레이스의 끝은 누락되었지만, 누락 된 호출은 제가 사용하고있는 테스트 프레임 워크에서 나온 것이므로 문제가 아닙니다. 그래도 문제는 여전히 남아 있으며 블로그 게시물에 나와있는 것과 똑같이하고 있습니다. 하나의 흥미로운 사실이지만 테스트 프레임 워크는 네임 스페이스에 함수가 있고 스택 트레이스에서 볼 수 있습니다. 함수는 ... 다시 테스트를 수행하고 (네임 스페이스에 함수를 넣음) 동일한 hapenned 함수를 다시 사용합니다 backtrace에서 더 이상 볼 수 없다 ... – foke