リモートロギングライブラリを介して、プログラムをクラッシュさせるセグメンテーション違反と実行時エラーをログに記録する手法は何ですか?
言語はC++です。
このようなエラーが発生したときに実行できる例として、セグメンテーション違反が発生したときにバックトレースを出力するためのソリューションを次に示します。
そのため、エラーをリモートライブラリに記録するという問題が残ります。セグメンテーション違反が発生したときに、以前に初期化されたログライブラリが正しく機能するとは想定できないため、シグナルハンドラをできるだけ単純に保ち、ローカルファイルにログを記録することをお勧めします。
リモートロギングライブラリを介して、プログラムをクラッシュさせるセグメンテーション違反と実行時エラーをログに記録する手法は何ですか?
私の経験から、プログラムがクラッシュしているときに (リモートまたはファイルに) デバッグ メッセージをログに記録しようとすると、特に APP がシステムをダウンさせる場合は、あまり信頼できない可能性があります。
私の知る限り、プログラムがクラッシュしたらメモリ内にプレーンテキストのログ ファイルを保持し、コア ダンプを書き込むことをお勧めします。このようにして、コア ダンプ内でログ ファイルの内容を見つけることができます。また、メモリ内ログへの書き込みは、ファイルへの書き込みやネットワーク経由でのメッセージの送信よりも大幅に高速になります。または、ある種の「デュアル ロギング」を使用することもできます。すべてのデバッグ メッセージをすぐにメモリ内ログに書き込み、非同期で (別のスレッドで) ログ ファイルまたはネットワーク経由で送信します。
例外の処理:
プラットフォーム固有。Windows プラットフォームでは、_set_se_handlersを使用して、バックトレースを生成するか、プラットフォームの例外を C++ の例外に変換するために使用できます。
Linux では、SIGSEGV シグナルのハンドラーを作成できるはずです。
segfault をキャッチするというのはまともなアイデアのように思えますが、プログラム内からそれを処理しようとする代わりに、コア ダンプを生成して保釈するのは理にかなっています。Windowsでは、プログラム内からMiniDumpWriteDumpを使用でき、Linuxシステムでは、シェルでコアダンプを生成するように構成できます(ulimit -c
と思いますか?)。
私はいくつかの解決策を提供したいと思います:
セグメンテーション違反のシグナルをキャッチし、それに応じてログを送信するには、次の投稿をお読みください。
シグナルハンドラーからログを送信できないことが判明した場合(ロガーが初期化される前にクラッシュが発生した可能性があります)、情報をファイルに書き込んで、外部エンティティにリモートで送信させる必要があります。
編集:コアファイルをリモートでも送信できるように、元の情報を元に戻します
コアファイルをリモートで送信できるようにするには、コアファイルを「待機」し、表示されたとおりにリモートで送信する外部エンティティ(クラッシュしたプロセスとは異なるプロセス)が必要です。(おそらくscpを使用)さらに、クラッシュプロセスは、segfaultシグナルをキャッチし、クラッシュが発生し、コアファイルがまもなく利用可能になることを監視プロセスに通知する可能性があります。