3

gcc (GCC) 4.5.3

GNU gdb (GDB) 7.5.50.20130309-cvs (cygwin スペシャル)

ネットビーンズ7.3

コードで SIGSEGV (Segment Fault Exception) をキャッチするのに問題があります。try-catch はそれをキャッチしません (以下のコード)。これはキャッチできない例外ですか? 捕まえる方法はありますか?(そしてもちろん)私は何を間違えましたか?

美術

string SlipStringOp::dump(const SlipCell& X) const {
   stringstream pretty;
   PTR ptr = *getPtr(X);

   pretty << "[string   ] " << dumpLink(X)  << " = " 
           << setfill('0') << setw(8) << hex << ptr
           << " -> ";
   try {
      pretty << ptr->dump();
   } catch(exception& e) {
      pretty << e.what();
      postError(SlipErr::E3023, "SlipStringOp::dump", "", "Deletion of cell deleted the pointer.");
   } catch(...) {
      postError(SlipErr::E3023, "SlipStringOp::dump", "", "Deletion of cell deleted the pointer.");   
   }
   return pretty.str();
}; // string SlipStringOp::dump(const SlipCell& X) const
4

3 に答える 3

7

SIGSEGV も例外ではありません。それは信号です。無効なメモリ アドレスへのアクセスは、セグメンテーション フォールトと呼ばれます。プログラムがこれを行うと、オペレーティング システムはプロセスに SIGSEGV シグナルを送信します。このシグナルのデフォルト ハンドラは、プロセスをただちに終了します。

シグナルを傍受することはできますが、これは自分で処理すべきシグナルではありません。あなたのプログラムがセグメンテーション違反を引き起こしているなら、間違いなくバグがあります。

セグメンテーション違反を行に分離した場合、問題はおそらく有効なオブジェクトを指していないことpretty << ptr->dump();だと思います。ptrまたは、dump関数が何か悪いことをしています。

シグナルを処理してこれを修正しようとしないでください。プログラムがセグメンテーション違反を引き起こさないようにして、これを修正してください

于 2013-03-15T23:42:01.123 に答える
1

ここで 2 つの質問があります。まず、なぜ SIGSEGV を取得しているのですか? ここにはおそらく十分なコードがないと思いますが、ptr->dump() への呼び出しは同じ関数を再帰的に呼び出していますか? もしそうなら、無限の再帰があり、それがセグフォルトを引き起こしています。

2 番目の質問は、シグナルをどのようにトラップするかです。それは以前のレスポンダーによって回答されています。

于 2013-03-15T23:45:38.323 に答える
0

式で例外をスローしますthrowcatch句で例外をキャッチします。

を呼び出してシグナルを発生させraiseます。例外が発生する前にハンドラーをインストールして、シグナルを処理します。

その他のアクションと対話はシステム固有です (つまり、移植できません)。

于 2013-03-16T00:22:52.000 に答える