i386でトレースバックを実装します
-
18-09-2019 - |
質問
私は現在、Cでのi386プロセッサ(Linuxの)にアルファ(のTru64)から私たちのコードを移植しています 私は移植に見てまで、すべてはかなり順調に上がっている私たちの 例外処理ルーチン。現在、我々は、親プロセスを持っています サブプロセスの多くを生成します、そしてときに、これらのサブプロセスの1 (unfielded)の致命的な私は、プロセスをキャッチするためのルーチンを持っています。
私は現在、現在、私のルーチンは、単に例外と例外修飾子コードを発生させた信号を出力し、エラー・ログに関数のアドレスを一覧表示することができますトレースバック・ルーチンを実装するための最良の方法を見つけるのに苦労しています。
すべてのヘルプは大幅に受信されるだろう、理想的に私は、しかし、この段階では、私が唯一本当にI386、とx86_64を気に、すべてのプロセッサのエラー処理を記述します。
おかげ
マーク
解決
backtrace()
からglibcの関数backtrace_symbols()
とexecinfo.h
は、使用のかもしれません。
他のヒント
あなたは http://tlug.up.ac.zaに見えるかもしれません/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGVする。それはあなたが必要な機能をカバーしています。しかし、あなたは、libgdbとlibdlにリンク(実行形式で複数のシンボルを含んでいる)-rdynamicでコンパイルすると、いくつかの最適化の使用を見合わせる必要があります。
backtrace()
とbacktrace_symbols()
- - あなたを助けることができる2つのGNU(非POSIX)機能があり、関数のアドレスと第二の最初の戻り値Arrayは、名前にアドレスを解決します。残念ながら、静的関数の名前が解決されないことができます。
あなたは-rdynamic
フラグであなたのバイナリをコンパイルする必要が取り組んでそれを得るために。
残念ながら、「最良の」方法はありません。しかし、この記事はを助けるかもしれない。
はのの子プロセスでこれを実装しなければならないことに注意してください。親プロセスはちょうど何かが間違っているという信号を取得します。あなたは子プロセスのスタックのコピーを得ることはありません。
コメント場合は、gccを使用している状態。こののhttp://gcc.gnu .ORG / onlinedocs / GCC-4.4.3 / gccを/リターンAddress.html#リターン・アドレスはのが有用である可能性があります。
valgrindのを走るときにのみ取得し、適切なバックトレースで罰金であれば、これはあなたのための選択肢かもしれません。
VALGRIND_PRINTF_BACKTRACE(フォーマット、...):
これは、静的なものも含めて、すべての機能のためにあなたのバックトレースを提供します。