3

_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);
}

情報をログに記録し、エラー レポートを送信したい。デバッグ ビルドではパラメーターを使用して有用な情報を取得できますが、リリース ビルドではすべてのパラメーターが NULL であり、あまり役に立ちません。リリース ビルドにも有用な情報を追加する方法はありますか?

4

1 に答える 1

5

MSDN ライブラリの記事の備考セクションで明示的に言及されています。

CRT ライブラリのデバッグ バージョンが使用されていない限り、すべてのパラメーターの値は NULL です。

その理由は、読みやすいように編集された 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 */

1 つの最適化が多すぎると思います。自分で _CRT_SECURE_INVALID_PARAMETER を #define できるのは魅力的に見えますが、自分で CRT を再構築しない限り機能しません。それは正確には実用的ではありません。

于 2012-03-10T17:11:09.160 に答える