Перехват кода операции 0xCC в качестве исключения

StackOverflow https://stackoverflow.com/questions/6034783

  •  14-11-2019
  •  | 
  •  

Вопрос

Скажем, программа на C может вызвать исключение из кода операции 0xCC
Как я могу это подхватить?

Я пытался:

__try   
    {

  ...some code

    }

__except(GetExceptionCode()==EXCEPTION_EXECUTE_HANDLER)     
{ 
     _tprintf(_T("Error\n"),i);

      return 0;
}

У меня это не работает.Что я делаю не так?Спасибо!

Это было полезно?

Решение

Вы не проверяете правильный код исключения.

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
}

РЕДАКТИРОВАТЬ:Пожалуйста, обратите внимание, что код, запущенный с подключенным отладчиком, будет нет смотрите на исключение, потому что отладчик обрабатывает его и очищает перед передачей команды обратно в код.

Другие советы

Поскольку это программа для 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 exception\n");
      break;

  }

  printf("** --- CRASH BANG BOOM ---\n");
  printf("** Exception             : 0x%08x\n",exceptioncode);
  printf("** Exception description : %s\n"    ,exceptiondesc);
  printf("** Exception flags       : 0x%08x\n",ExceptionInfo->ExceptionRecord->ExceptionFlags);
  printf("** Exception address     : 0x%08x\n",ExceptionInfo->ExceptionRecord->ExceptionAddress);
  printf("**\n");

  //return EXCEPTION_EXECUTE_HANDLER;
  //return EXCEPTION_CONTINUE_EXECUTION;
  //return EXCEPTION_CONTINUE_SEARCH;

  return 0;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top