c/c++语言开发共享捕获操作码0xCC作为例外

假设C程序可能触发操作码0xCC的exception
我该怎么抓住它?

我试过了:

 __try { ...some code } __except(GetExceptionCode()==EXCEPTION_EXECUTE_HANDLER) { _tprintf(_T("Errorn"),i); return 0; } 

这不适合我。 我究竟做错了什么? 谢谢!

    您没有检查正确的exception代码。

    int 3抛出EXCEPTION_SINGLE_STEP

    你这样处理它:

     __try { // some code that might cause an int3 } __except(GetExceptionCode() == EXCEPTION_SINGLE_STEP ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { // error handling of int3 } 

    编辑:请注意,附带调试器的代码不会看到exception,因为调试器处理它并在将手传回代码之前将其清除。

    由于这是一个win32程序,你可以随时设置自己的“crashhandler”这是我的一个程序的粗略剪辑。 使用风险;)

     LONG WINAPI crashhandler(struct _EXCEPTION_POINTERS* ExceptionInfo); SetErrorMode(SEM_FAILCRITICALERRORS); SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)crashhandler); LONG WINAPI crashhandler(struct _EXCEPTION_POINTERS* ExceptionInfo) { DWORD exceptioncode; char exceptiondesc[8192]; exceptioncode = ExceptionInfo->ExceptionRecord->ExceptionCode; switch(exceptioncode) { case EXCEPTION_ACCESS_VIOLATION: strcpy(exceptiondesc,"EXCEPTION_ACCESS_VIOLATION:"); break; case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: strcpy(exceptiondesc,"EXCEPTION_ARRAY_BOUNDS_EXCEEDED:"); break; case EXCEPTION_BREAKPOINT: strcpy(exceptiondesc,"EXCEPTION_BREAKPOINT:"); break; case EXCEPTION_DATATYPE_MISALIGNMENT: strcpy(exceptiondesc,"EXCEPTION_DATATYPE_MISALIGNMENT:"); break; case EXCEPTION_FLT_DENORMAL_OPERAND: strcpy(exceptiondesc,"EXCEPTION_FLT_DENORMAL_OPERAND:"); break; case EXCEPTION_FLT_DIVIDE_BY_ZERO: strcpy(exceptiondesc,"EXCEPTION_FLT_DIVIDE_BY_ZERO:"); break; case EXCEPTION_FLT_INEXACT_RESULT: strcpy(exceptiondesc,"EXCEPTION_FLT_INEXACT_RESULT:"); break; case EXCEPTION_FLT_INVALID_OPERATION: strcpy(exceptiondesc,"EXCEPTION_FLT_INVALID_OPERATION:"); break; case EXCEPTION_FLT_OVERFLOW: strcpy(exceptiondesc,"EXCEPTION_FLT_OVERFLOW:"); break; case EXCEPTION_FLT_STACK_CHECK: strcpy(exceptiondesc,"EXCEPTION_FLT_STACK_CHECK:"); break; case EXCEPTION_FLT_UNDERFLOW: strcpy(exceptiondesc,"EXCEPTION_FLT_UNDERFLOW:"); break; case EXCEPTION_ILLEGAL_INSTRUCTION: strcpy(exceptiondesc,"EXCEPTION_ILLEGAL_INSTRUCTION:"); break; case EXCEPTION_IN_PAGE_ERROR: strcpy(exceptiondesc,"EXCEPTION_IN_PAGE_ERROR:"); break; case EXCEPTION_INT_DIVIDE_BY_ZERO: strcpy(exceptiondesc,"EXCEPTION_INT_DIVIDE_BY_ZERO:"); break; case EXCEPTION_INT_OVERFLOW: strcpy(exceptiondesc,"EXCEPTION_INT_OVERFLOW:"); break; case EXCEPTION_INVALID_DISPOSITION: strcpy(exceptiondesc,"EXCEPTION_INVALID_DISPOSITION:"); break; case EXCEPTION_NONCONTINUABLE_EXCEPTION: strcpy(exceptiondesc,"EXCEPTION_NONCONTINUABLE_EXCEPTION:"); break; case EXCEPTION_PRIV_INSTRUCTION: strcpy(exceptiondesc,"EXCEPTION_PRIV_INSTRUCTION:"); break; case EXCEPTION_SINGLE_STEP: strcpy(exceptiondesc,"EXCEPTION_SINGLE_STEP:"); break; case EXCEPTION_STACK_OVERFLOW: strcpy(exceptiondesc,"EXCEPTION_STACK_OVERFLOW:"); break; default: strcpy(exceptiondesc,"Unknown exceptionn"); break; } printf("** --- CRASH BANG BOOM ---n"); printf("** Exception : 0x%08xn",exceptioncode); printf("** Exception description : %sn" ,exceptiondesc); printf("** Exception flags : 0x%08xn",ExceptionInfo->ExceptionRecord->ExceptionFlags); printf("** Exception address : 0x%08xn",ExceptionInfo->ExceptionRecord->ExceptionAddress); printf("**n"); //return EXCEPTION_EXECUTE_HANDLER; //return EXCEPTION_CONTINUE_EXECUTION; //return EXCEPTION_CONTINUE_SEARCH; return 0; } 

      以上就是c/c++开发分享捕获操作码0xCC作为例外相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(计算机技术网)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/550023.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐