1. ホーム
  2. c++

[解決済み] Linuxでセグメンテーションフォールトを検出する方法は?

2023-01-08 12:48:55

質問

サードパーティライブラリのクリーンアップ処理で、セグメンテーションフォールトをキャッチする必要があります。これは、私のプログラムが終了する直前に時々発生し、この本当の理由を修正することはできません。Windows プログラミングでは、__try - __catch でこれを行うことができました。同じことをするクロスプラットフォームまたはプラットフォーム固有の方法はありますか?私はLinux、gccでこれを必要とします。

どのように解決するのですか?

Linuxでも例外として扱われることがあります。

通常、プログラムがセグメンテーションフォールトを実行するとき、そのプログラムには SIGSEGV シグナルを送信します。 このシグナルに対して独自のハンドラを設定し、結果を軽減することができます。 もちろん、本当に ができる を回復できることを確認する必要があります。 あなたの場合、代わりにコードをデバッグするべきだと思います。

話を戻します。 最近、私は ライブラリ ( ショートマニュアル ) を使えば、このようなシグナルを例外に変換することができるので、次のようなコードを書くことができます。

try
{
    *(int*) 0 = 0;
}
catch (std::exception& e)
{
    std::cerr << "Exception caught : " << e.what() << std::endl;
}

私のx86-64 Gentooボックスで動作します。 プラットフォームに特化したバックエンド(gccのjava実装から拝借)を持っているので、多くのプラットフォームで動作します。 x86とx86-64をサポートしているだけですが、gccのソースに存在するlibjavaからバックエンドを取得することができます。