5

リモートロギングライブラリを介して、プログラムをクラッシュさせるセグメンテーション違反と実行時エラーをログに記録する手法は何ですか?

言語はC++です。

4

4 に答える 4

6

このようなエラーが発生したときに実行できる例として、セグメンテーション違反が発生したときにバックトレースを出力するためのソリューションを次に示します。

そのため、エラーをリモートライブラリに記録するという問題が残ります。セグメンテーション違反が発生したときに、以前に初期化されたログライブラリが正しく機能するとは想定できないため、シグナルハンドラをできるだけ単純に保ち、ローカルファイルにログを記録することをお勧めします。

于 2012-05-08T10:07:32.950 に答える
1

リモートロギングライブラリを介して、プログラムをクラッシュさせるセグメンテーション違反と実行時エラーをログに記録する手法は何ですか?

私の経験から、プログラムがクラッシュしているときに (リモートまたはファイルに) デバッグ メッセージをログに記録しようとすると、特に APP がシステムをダウンさせる場合は、あまり信頼できない可能性があります。

  1. TCP 接続では、システムがクラッシュしている間に最後のいくつかのメッセージが失われる可能性があります。(TCPはデータパケットの順序を維持し、エラー訂正を使用します。そのため、アプリが終了しただけでは、送信される前に一部のデータが失われる可能性があります)
  2. UDP 接続では、UDP の性質によりメッセージが失われ、順不同で受信される可能性があります
  3. ファイルに書き込んでいる場合、OS は最新の変更を破棄する可能性があります (バッファーはフラッシュされず、ジャーナル化されたファイルシステムはファイルの以前の状態に戻ります)。
  4. 毎秒数千のメッセージを生成するプログラムの場合、毎回の書き込みまたは TCP/UDP を介したメッセージの送信後にバッファをフラッシュすると、パフォーマンスが低下する可能性があります。

私の知る限り、プログラムがクラッシュしたらメモリ内にプレーンテキストのログ ファイルを保持し、コア ダンプを書き込むことをお勧めします。このようにして、コア ダンプ内でログ ファイルの内容を見つけることができます。また、メモリ内ログへの書き込みは、ファイルへの書き込みやネットワーク経由でのメッ​​セージの送信よりも大幅に高速になります。または、ある種の「デュアル ロギング」を使用することもできます。すべてのデバッグ メッセージをすぐにメモリ内ログに書き込み、非同期で (別のスレッドで) ログ ファイルまたはネットワーク経由で送信します。

例外の処理:

プラットフォーム固有。Windows プラットフォームでは、_set_se_handlersを使用して、バックトレースを生成するか、プラットフォームの例外を C++ の例外に変換するために使用できます。

Linux では、SIGSEGV シグナルのハンドラーを作成できるはずです。

segfault をキャッチするというのはまともなアイデアのように思えますが、プログラム内からそれを処理しようとする代わりに、コア ダンプを生成して保釈するのは理にかなっています。Windowsでは、プログラム内からMiniDumpWriteDumpを使用でき、Linuxシステムでは、シェルでコアダンプを生成するように構成できます(ulimit -cと思いますか?)。

于 2012-05-08T12:01:24.020 に答える
1

私はいくつかの解決策を提供したいと思います:

  1. コア ダンプを使用してデーモンを開始し、コア ダンプを監視して収集し、ホストに送信します。
  2. GDB (GdbServer を使用) を使用すると、リモートでデバッグして、クラッシュした場合にバックトレースを確認できます。 ここに画像の説明を入力
于 2012-05-08T11:07:48.090 に答える
0

セグメンテーション違反のシグナルをキャッチし、それに応じてログを送信するには、次の投稿をお読みください。

「セグメンテーション違反」をトラップする意味はありますか?

シグナルハンドラーからログを送信できないことが判明した場合(ロガーが初期化される前にクラッシュが発生した可能性があります)、情報をファイルに書き込んで、外部エンティティにリモートで送信させる必要があります。

編集:コアファイルをリモートでも送信できるように、元の情報を元に戻します

コアファイルをリモートで送信できるようにするには、コアファイルを「待機」し、表示されたとおりにリモートで送信する外部エンティティ(クラッシュしたプロセスとは異なるプロセス)が必要です。(おそらくscpを使用)さらに、クラッシュプロセスは、segfaultシグナルをキャッチし、クラッシュが発生し、コアファイルがまもなく利用可能になることを監視プロセスに通知する可能性があります。

于 2012-05-08T10:05:48.813 に答える