Zaimplementowałem to samodzielnie here.
Początkowo chciałem zaimplementować coś podobnego do sugestii here, tj. Uzyskać jakoś górny wskaźnik ramki wątku i odwijać go ręcznie (połączone źródło pochodzi z implementacji Jabłek backtrace
, dlatego może być specyficzne dla Apple, ale pomysł jest ogólny).
Jednakże, aby mieć to bezpieczne (i powyższe źródło nie jest, a nawet może być zepsute), musisz zawiesić wątek, gdy będziesz mieć dostęp do jego stosu. Szukałem różnych sposobów zawieszenia wątku i znalazłem this,i this. Zasadniczo nie ma naprawdę dobrej drogi. Wspólnym hackiem, także used by the Hotspot JAVA VM, jest użycie sygnałów i wysłanie niestandardowego sygnału do twojego wątku poprzez pthread_kill.
Tak więc, tak jak i ja potrzebowałbym takiego hackowania sygnału, mógłbym mieć go nieco prostszego i po prostu użyć backtrace
wewnątrz wywoływanego manipulatora sygnału, który jest wykonywany w docelowym wątku (jak również zasugerował here by sandeep). Jest to w zasadzie to, co robi moja implementacja.
Jeśli jesteś również zainteresowany drukowaniem śladu po śladach, to jest uzyskać przydatne informacje dotyczące debugowania (nazwa funkcji, nazwa pliku źródłowego, numer linii kodu źródłowego, ...), przeczytaj here o rozszerzonym backtrace_symbols
na podstawie libbfd. Lub po prostu zobacz źródło here.
Nie jest to dokładnie to, czego szukałem, ale jest to niezły pomysł. Myślę, że mogę go użyć. Dzięki! –
@Alexander jest rozwiązaniem dla ciebie, gdy malloc lub darmowe połączenia przypominają stos wywołań ..? i czy możesz wywołać metodę backtrace() w tym przypadku z programu obsługi sygnału? Mam awarię. – sandeep
W końcu zdecydowałem się pracować z libunwind. To rozwiązanie jest zbyt skomplikowane dla moich okoliczności i postanowiłem go porzucić. W każdym razie, opublikuj tutaj, jeśli sprawisz, że zadziała jakoś. –