_invalid_parameter не получает никакой полезной информации в сборке выпуска - PullRequest
2 голосов
/ 10 марта 2012

Я использую _set_invalid_parameter_handler для переопределения поведения программы по умолчанию, когда функция CRT получает недопустимый параметр, который должен завершиться с 0xc0000417 (STATUS_INVALID_CRUNTIME_PARAMETER).

Это мой обработчик:

void my_invalid_parameter_handler(
    const wchar_t * expression,
    const wchar_t * function, 
    const wchar_t * file, 
    unsigned int line,
    uintptr_t pReserved
    )
{
    Log(L"Invalid parameter detected");
    Log(L"expression= %s", expression);
    Log(L"function= %s", function);
    Log(L"file= %s", file);
    Log(L"line= %d", line);
    Log(L"pReserved= %p", pReserved);
}

Я хочу зарегистрировать информацию и отправить отчет об ошибке.В сборке Debug я получаю полезную информацию с параметрами, но в сборке Release все параметры имеют значение NULL, что не очень полезно.Есть ли способ добавить полезную информацию в сборки релиза?

1 Ответ

4 голосов
/ 10 марта 2012

Это явно упоминается в разделе «Примечания» статьи MSDN Library :

Все параметры имеют значение NULL, если не используется отладочная версия библиотеки CRT

Причина видна из заголовочного файла crtdefs.h, отредактированного для удобства чтения:

#ifdef _DEBUG
#  ifndef _CRT_SECURE_INVALID_PARAMETER
#    define _CRT_SECURE_INVALID_PARAMETER(expr) \
       ::_invalid_parameter(__STR2WSTR(#expr), _FUNCTIONW__, __FILEW__, __LINE__, 0)
#  endif

#else

 /* By default, _CRT_SECURE_INVALID_PARAMETER in retail invokes_invalid_parameter_noinfo_noreturn(),
  * which is marked __declspec(noreturn) and does not return control to the application. Even if
  * _set_invalid_parameter_handler() is used to set a new invalid parameter handler which does return
  * control to the application, _invalid_parameter_noinfo_noreturn() will terminate the application and
  * invoke Watson. You can overwrite the definition of _CRT_SECURE_INVALID_PARAMETER if you need.
  *
  * _CRT_SECURE_INVALID_PARAMETER is used in the Standard C++ Libraries and the SafeInt library.
  */
#  ifndef _CRT_SECURE_INVALID_PARAMETER
#    define _CRT_SECURE_INVALID_PARAMETER(expr) ::_invalid_parameter_noinfo_noreturn()
#  endif  /* _CRT_SECURE_INVALID_PARAMETER */
#endif  /* _DEBUG */

Одной оптимизации слишком много, я бы сказал. Возможность #define _CRT_SECURE_INVALID_PARAMETER сама по себе выглядит привлекательно, но не работает, если вы не перестроите CRT самостоятельно. Это не совсем практично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...