質問が述べているように、すべてのエラー関数とシグナルハンドラーでソフトウェアベースのバックトレース(libcバックトレースhttp://www.gnu.org/software/libc/manual/html_node/Backtraces.htmlを使用するなど)を常に収集することは有用ですか? ?
メモリ、同時実行性のバグなど、さまざまなバグのデバッグにはあまり役立ちませんか?エラーパスでのみトリガーされるだけでなく、通常のパフォーマンスを損なうことはないと思います。
質問が述べているように、すべてのエラー関数とシグナルハンドラーでソフトウェアベースのバックトレース(libcバックトレースhttp://www.gnu.org/software/libc/manual/html_node/Backtraces.htmlを使用するなど)を常に収集することは有用ですか? ?
メモリ、同時実行性のバグなど、さまざまなバグのデバッグにはあまり役立ちませんか?エラーパスでのみトリガーされるだけでなく、通常のパフォーマンスを損なうことはないと思います。
質問が述べているように、ソフトウェアベースのバックトレースを常に収集することは有用ですか
はい、一般的に、次の場合にクラッシュスタックトレースを作成すると非常に便利です。
libcバックトレースを使用するような
glibcは特定の条件下でbacktrace
呼び出し、クラッシュハンドラーでは安全ではありません。calloc
これは、ハングと上記のさらなる破損の両方を引き起こす可能性があります。スタックトレースを非同期信号に対して安全な方法で確実に出力するクラッシュハンドラを作成することは、非常に簡単ではありません。
では、なぜ「標準」アプリケーションのエラー関数がバックトレースを呼び出さないのでしょうか。
考えてみてくださいcat /no/such/file
。現在、以下を生成します。
cat: /no/such/file: No such file or directory
あなたが本当に知る必要があるのはこれだけです。この印刷物を他のものにすることは無意味です。そのようなファイルがたくさんあり、catがそれぞれの完全なスタックトレースを出力した場合、エラー出力のページが多くなり、実際の問題を見つけるのが難しくなります。
致命的なシグナルハンドラー(例SIGSEGV
)の場合、答えは、ほとんどの「標準」アプリケーションは実際にはそのようなシグナルを処理せず、コアダンプを生成するデフォルトのアクションを使用するだけです。
backtrace
ただし、シグナルをキャッチした場合、、、backtrace_symbols
またはシグナルハンドラーからの呼び出しbacktrace_symbols_fd
も同様に安全ではなく、デッドロックが発生する可能性があります。これは、単にコアをダンプするよりもはるかに悪いことです。1000個のコマンドを含む長時間実行スクリプトがある場合にどうなるかを考えてみてください。それを開始すると、1週間後、2番目のコマンドがクラッシュし、クラッシュスタックトレースを印刷しようとしてデッドロックしたため、進行しなかったことがわかりました。