2012-03-10 88 views
2

我正在使用_set_invalid_parameter_handler重寫程序的默認行爲,當CRT函數獲取一個無效的參數,它將與0xc0000417(STATUS_INVALID_CRUNTIME_PARAMETER)崩潰。_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); 
} 

我要記錄的信息,併發送錯誤報告。在Debug版本中,我通過參數獲得有用的信息,但在Release版本中,所有參數都是NULL,這不是很有用。有什麼方法可以在發佈版本中添加有用的信息?

+0

'除非使用CRT庫的調試版本,''參數都具有值NULL。 ' – 2012-03-10 16:02:52

+0

謝謝。那麼回答我的問題。如果您將發佈爲答案,我會選擇它作爲正確的答案。 – sashoalm 2012-03-10 16:28:56

回答

3

它在MSDN Library article的備註部分明確提到:

的參數都有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,否則無法工作。這不是很實際。

+0

只是偶然發現了這一點。什麼是更實際的解決方案?例如。打印一些比這更有用的斷言信息「2014-11-13 13:33:14 [4548]斷言失敗:(空)函數(空)在文件(空)在第0行」 – CouchDeveloper 2014-11-13 12:38:20

+0

那麼,_set_invalid_parameter_handler()適度更實用。當你的處理程序被調用時,一定要生成一個小型轉儲,你需要它。 – 2014-11-13 12:45:54

+0

我已經安裝了這個處理程序,通過記錄器打印消息。另外,我現在記錄一個堆棧跟蹤。謝謝你的提示! ;) – CouchDeveloper 2014-11-13 16:40:12

相關問題