gpt4 book ai didi

c++ - SetErrorMode 和/MDd (/MTd) 编译标志

转载 作者:行者123 更新时间:2023-11-28 07:01:59 24 4
gpt4 key购买 nike

我需要防止 Visual Studio 调试器的默认消息框在堆损坏期间显示。根据documentation它应该很简单:

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 是执行测试的父进程(调用 SetErrorMode )。然后将测试提交给 CDash(相当于 jenkins/hudson)。但是,如果出现堆损坏的消息框,则测试被标记为执行时间过长,而不是很好地报告低级别问题。我无法控制用户编译标志,只需要一种方法来防止消息框出现。

最佳答案

如果您正在研究如何像这样禁用/抑制模态对话框:

enter image description here

那么您需要阻止 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.

关于c++ - SetErrorMode 和/MDd (/MTd) 编译标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22306820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com