私はここでそれを自分で実装しました。
最初は、ここで提案されているようなものを実装したかったのです。つまり、スレッドのトップフレームポインタを取得して手動で巻き戻しました(リンクされたソースはApplebacktrace
の実装から派生しているため、Apple固有の可能性がありますが、考え方は一般的です)。
ただし、その安全性を確保するには(そして、上記のソースは壊れている可能性があり、とにかく壊れている可能性もあります)、スタックにアクセスしている間、スレッドを一時停止する必要があります。スレッドを一時停止するさまざまな方法を探し回って、これ、これ、これを見つけました。基本的に、本当に良い方法はありません。Hotspot JAVA VMでも使用される一般的なハックは、シグナルを使用し、 pthread_killを介してカスタムシグナルをスレッドに送信することです。
したがって、とにかくそのようなシグナルハックが必要になるので、少し単純にbacktrace
して、ターゲットスレッドで実行される呼び出されたシグナルハンドラー内で使用することができます(ここでもsandeepによって提案されています)。これは基本的に私の実装が行っていることです。
バックトレースの印刷にも関心がある場合、つまり、有用なデバッグ情報(関数名、ソースコードファイル名、ソースコード行番号など)を取得する場合は、libbfdに基づく拡張についてここをお読みください。または、こちらbacktrace_symbols
のソースをご覧ください。