我需要阻止Visual Studio Debugger中的默认消息框在堆损坏期间显示。根据{{3}},它应该是一个简单的:
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
但是我无法完成上述工作。这是我的小玩具示例:
$ cat hc.cxx
#include <windows.h>
int main()
{
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
char * p = new char[10];
for( int i = 0; i < 500; ++i ) p[i] = i;
delete p;
return 0;
}
如果我没有标记编译它,一切都按预期进行(没有消息框):
$ cl hc.cxx
但是,如果我决定使用/ MDd,那么会出现恼人的消息框:
$ cl /MDd hc.cxx
与/ MTd相同的问题。
我的系统是安装了SP2的Windows Vista Pro / 32位。编译器是Visual Studio 2010,cl版本是16.00.40219.01。我的系统上没有SetThreadErrorMode。
如果这有助于理解问题:我正在使用CMake + CTest进行自动化测试。 CTest是执行测试的父进程(调用documentation)。然后将测试提交给CDash(相当于jenkins / hudson)。但是,如果出现堆损坏的消息框,则测试标记为执行时间过长,而不是很好地报告低级别问题。我无法控制用户编译标志,只需要一种方法来阻止消息框出现。
答案 0 :(得分:1)
如果您正在研究如何禁用/禁止模态对话框,请执行以下操作:
然后,您需要阻止C ++运行时消息传递而不是操作系统崩溃报告。 _CrtSetReportMode
就是您所需要的:
#include <crtdbg.h>
int _tmain(int argc, _TCHAR* argv[])
{
//SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
您仍然有报告,但这次是在调试输出中,非阻塞:
f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c(1322) : Assertion failed: _CrtIsValidHeapPointer(pUserData)
HEAP CORRUPTION DETECTED: after Normal block (#161) at 0x002D2448.
CRT detected that the application wrote to memory after end of heap buffer.
HEAP[ConsoleApplication11.exe]: Heap block at 002D2420 modified at 002D2456 past requested size of 2e
ConsoleApplication11.exe has triggered a breakpoint.
HEAP[ConsoleApplication11.exe]: Invalid address specified to RtlFreeHeap( 002D0000, 002D2428 )
ConsoleApplication11.exe has triggered a breakpoint.