如果应用程序命中了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/

10-11 23:40