如果应用程序命中了assert(false)
,并且有时创建了很多次,并且填充了我的屏幕,则处于 Debug模式下的Windows CRT将显示“中止,重试,忽略” 窗口。
如果断言会在调试器中中断并且不问我任何问题,我将非常喜欢。
我已经修改了CRT reporting flags,但没有任何效果。
我也尝试过修改reporting hook。在出现25-30个“中止”对话框后,它确实会被调用。
如果有帮助,我正在构建一个由单独的程序加载的DLL。看起来宿主程序加载我的DLL与调用我的代码的线程不一致。
似乎其中一个线程已停止,但其他线程仍在运行。
如何配置CRT来做到这一点?
最佳答案
这是可行的(对我来说,至少在vs 2008上):
(本质上,从 Hook 函数返回TRUE)
int __cdecl CrtDbgHook(int nReportType, char* szMsg, int* pnRet)
{
return TRUE;//Return true - Abort,Retry,Ignore dialog will *not* be displayed
return FALSE;//Return false - Abort,Retry,Ignore dialog *will be displayed*
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, CrtDbgHook);
assert(false);
getch();
return 1;
}
您还可以编写自己的类似断言的行为(请注意,这将显示“中断,继续”对话框):
#define MYASSERT(x) { if(!(x)) {DbgRaiseAssertionFailure();} }
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
MYASSERT(false);
getch();
return 1;
}
希望对您有所帮助!
关于visual-studio - Windows CRT和断言报告(中止,重试,忽略),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1121698/