Próbuję uzyskać ślad wsteczny w pewnym momencie wykonywania mojego programu (C++).Stacktrace i funkcje w przestrzeniach nazw
dla tego używam backtrace i backtrace_symbols. Coś w tym stylu:
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;
}
Działa, ale brakuje niektórych nazw funkcji. Przykład:
[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]
...
funkcje 0 do 8 mają jeden punkt wspólny: wszyscy siadają w obszarze nazw ...
Próbowałem funkcji 9 umieszczenie w przestrzeni nazw anonimowych (bez innych modyfikacji) i disapears od backtrace ... który teraz wygląda następująco:
[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]
...
Czy istnieje sposób, aby to naprawić?
PS: wersja g ++: g ++ (GCC) 4.6.0 20.110.530 (Red Hat 4.6.0-9)
edit ustalona maksymalna głębokość backtrace po Code Monkey uwagą
Edit2 dodał pełny kod funkcji
Edit3 kod jest skompilowany z -O0 -g3 i połączonego z -rdynamic
Witam, dziękuję za odpowiedź.masz rację co do maksymalnej głębokości, brakuje końca śledzenia wstecznego, ale to nie jest problem, ponieważ te brakujące połączenia pochodzą z używanego przez mnie schematu testowego. Mimo to problem pozostaje i robię to samo, co w blogu. Jeden interesujący fakt jednak, struktura testowa ma funkcje w przestrzeniach nazw i są one widoczne w stosie, moje funkcje nie są ... Zrobiłem test ponownie (umieszczając funkcję w przestrzeni nazw), i to samo stało się ponownie (funkcja nie jest już widoczny na backtrace ... – foke