4

現在、コードをアルファ版(Tru64)からCのi386プロセッサ(Linux)に移植しています。例外処理ルーチンの移植を検討するまで、すべてが順調に進んでいます。現在、多くのサブプロセスを生成する親プロセスがあり、これらのサブプロセスの1つが致命的な(フィールド化されていない)場合、プロセスをキャッチするルーチンがあります。

私は現在、エラーログに関数アドレスをリストできるトレースバックルーチンを実装するための最良の方法を見つけるのに苦労しています。現在、私のルーチンは、例外の原因となった信号と例外修飾子コードを出力するだけです。

どんな助けでも大いに受け取られるでしょう、理想的には私はすべてのプロセッサのためにエラー処理を書くでしょう、しかしこの段階で私は本当にi386とx86_64だけを気にします。

ありがとう

マーク

4

6 に答える 6

2

The glibc functions backtrace() and backtrace_symbols(), from execinfo.h, might be of use.

于 2010-03-08T12:04:12.823 に答える
2

http://tlug.up.ac.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGVをご覧ください。それはあなたが必要とする機能をカバーしています。ただし、libgdbおよびlibdlに対してリンクし、-rdynamicを使用してコンパイルし(実行可能ファイルにさらに多くのシンボルを含める)、一部の最適化を使用しないようにする必要があります。

于 2010-03-08T10:28:42.100 に答える
1

There are two GNU (non-POSIX) functions that can help you - backtrace() and backtrace_symbols() - first returns array of function addresses and second resolves addresses to names. Unfortunately names of static functions cannot be resolved.

To get it working you need to compile your binary with -rdynamic flag.

于 2010-03-08T12:00:07.690 に答える
0

残念ながら、スタックのレイアウトは、コードのコンパイルに使用されるCPU、OS、およびコンパイラによって異なる可能性があるため、「最良の」方法はありません。しかし、この記事は役立つかもしれません

これは子プロセスで実装する必要があることに注意してください。親プロセスは、何かが間違っているというシグナルを受け取るだけです。子スタックのコピーを取得しません。

于 2010-03-08T10:00:37.957 に答える
0

コメントの場合は、gccを使用していると述べています。このhttp://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Return-Address.html#Return-Addressが役立つ可能性があります。

于 2010-03-08T10:28:04.487 に答える
0

valgrindを実行しているときに適切なバックトレースを取得するだけで問題がない場合は、これがオプションになる可能性があります。

VALGRIND_PRINTF_BACKTRACE(format、...):

静的関数を含むすべての関数のバックトレースが提供されます。

于 2011-07-09T12:54:03.240 に答える