Windowsアプリケーションはセグメンテーション違反をどのように処理できますか?「ハンドル」とは、それらを傍受し、おそらく説明的なメッセージを出力することを意味します。また、それらから回復する能力も素晴らしいでしょうが、それは複雑すぎると思います。
6 に答える
それらをクラッシュさせ、Windowsエラー報告で処理させます-Vista +では、ユーザーの作業を保存してアプリケーション(Word / Excelなど)を再起動できるように、RestartManagerへの登録も検討する必要があります。します)
初期の例外処理にはSEHを使用し、説明メッセージを表示するにはSetUnhandledExceptionFilterを使用します。
/EHa
コンパイラ引数を追加するtry {} catch(...)
と、SEH例外を含むすべての例外がキャッチされます。例外がキャッチされたときに何をするかについてより柔軟な方法を提供するを
使用することもできます。関数全体に__try {} __except {}
を付けることは、を使用することとある程度同じです。__try {} __except {}
main()
SetUnhandeledExceptionFilter()
そうは言っても、適切な用語を使用する必要があります。「seg-fault」はUNIXの用語です。Windowsにセグメンテーション違反はありません。ウィンドウでは、「アクセス違反の例外」と呼ばれます
ここで何をしたいかは、どのような種類の障害に関係しているかによって異なります。多かれ少なかれランダムな一般保護違反を起こしやすいずさんなコードがある場合は、@PaulBettsの回答が必要です。
悪いポインタを尊重する正当な理由があるコードがあり、回復したい場合は、SEHに関する@whunmrの提案から始めてください。障害が発生した時点でのコードの状態と回復方法を正確に把握できるようにコードを十分に制御できれば、処理して実際に回復できます。
SetUnhandledExceptionFilter
使用方法、書き込み障害のトリガー、および適切なエラーメッセージの表示に関するC++の自己完結型の例:
#include <windows.h>
#include <sstream>
LONG WINAPI TopLevelExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
std::stringstream s;
s << "Fatal: Unhandled exception 0x" << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode
<< std::endl;
MessageBoxA(NULL, s.str().c_str(), "my application", MB_OK | MB_ICONSTOP);
exit(1);
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
SetUnhandledExceptionFilter(TopLevelExceptionHandler);
int *v=0;
v[12] = 0; // should trigger the fault
return 0;
}
で正常にテストされましたg++
(MSVC ++でも正常に動作するはずです)
Jean-FrançoisFabreソリューションに似ていますが、MinGW-w64にPosixコードがあります。ただし、プログラムを終了する必要があることに注意してください。SIGSEGVから回復して続行することはできません。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void sigHandler(int s)
{
printf("signal %d\n", s);
exit(1);
}
int main()
{
signal(SIGSEGV, sigHandler);
int *v=0;
*v = 0; // trigger the fault
return 0;
}