2012-03-10 20 views
2

CRT関数が0xc0000417(STATUS_INVALID_CRUNTIME_PARAMETER)でクラッシュする無効なパラメータを取得したときに、_set_invalid_parameter_handlerを使用してプログラムのデフォルト動作をオーバーライドしています。_invalid_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になっていますが、これはあまり役に立ちません。リリースビルドにも役立つ情報を追加する方法はありますか?

+0

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

+0

ありがとうございます。さて、私の質問に答えます。あなたが答えとして投稿するなら、私は正しい答えとしてそれを選択します。 – sashoalm

答えて

3

それが明示的MSDN Library articleの解説に記載されている: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を自分で再構築しない限りうまくいかない。正確には実用的ではありません。

+0

ちょうどこれを見つけた。より現実的な解決策は何でしょうか?例えば。アサーション情報をより便利に出力する "2014-11-13 13:33:14 [4548]アサーションに失敗しました:0行目のファイル(null)内の関数(null)内で(null)" – CouchDeveloper

+0

まあ、_set_invalid_parameter_handlerより実用的。ハンドラが呼び出されたときに必ずミニダンプを生成してください。必要になります。 –

+0

私は既にこのハンドラをインストールしていました。ここでは、ロガー経由でメッセージを印刷します。さらに、スタックトレースを記録するようになりました。ヒントをありがとう! ;) – CouchDeveloper

関連する問題