Я сам реализовал это здесь .
Изначально я хотел реализовать нечто подобное, как предлагалось здесь , то есть получить каким-то образом указатель верхнего кадра потока ираскручивать его вручную (связанный источник получен из реализации Apple backtrace
, поэтому может быть специфичным для Apple, но идея универсальна).
Однако, чтобы это было безопасно (а источник выше неможет даже порваться), вы должны приостановить поток при доступе к его стеку.Я искал различные способы приостановить поток и нашел это , это и это .В принципе, нет действительно хорошего способа.Обычный взлом, также используемый Hotspot JAVA VM , заключается в использовании сигналов и отправке собственного потока в ваш поток с помощью pthread_kill .
Итак, как я хотел быв любом случае, мне нужен такой взлом сигнала, я могу сделать его немного проще и просто использовать backtrace
внутри обработчика вызываемого сигнала, который выполняется в целевом потоке (как также предложено здесь sandeep ).Это в основном то, что делает моя реализация.
Если вам также интересно напечатать обратную трассировку, то есть получить некоторую полезную информацию об отладке (имя функции, имя файла исходного кода, номер строки исходного кода, ...), прочитайте здесь о расширенном backtrace_symbols
на основе libbfd.Или просто посмотрите источник здесь .