首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetErrorMode和/MDd (/MTd)编译标志

SetErrorMode和/MDd (/MTd)编译标志
EN

Stack Overflow用户
提问于 2014-03-10 17:14:45
回答 1查看 548关注 0票数 1

我需要防止Visual调试器在堆损坏期间显示默认消息框。根据文档,它应该很简单,如下所示:

代码语言:javascript
复制
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);

然而,我不能让上面的工作。这是我的小玩具例子:

代码语言:javascript
复制
$ 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;
}

如果我编译它时没有任何标志,那么一切都会如愿以偿(没有消息框):

代码语言:javascript
复制
$ cl hc.cxx

但是,如果我决定使用/MDd,则会返回恼人的消息框:

代码语言:javascript
复制
$ cl /MDd hc.cxx

/MTd也有同样的问题。

我的系统是Windows /32位,安装了SP2。编译器为Visual 2010,cl版本为16.00.40219.01。SetThreadErrorMode在我的系统上不可用。

如果这有助于理解问题:我正在使用CMake+CTest进行自动化测试。CTest是执行测试的父进程(调用SetErrorMode)。然后将测试提交给CDash (相当于jenkins/hudson)。但是,如果出现堆损坏消息框,则测试被标记为执行时间过长,而不是很好地报告低级别问题。我无法控制用户编译标志,只需要一种防止消息框出现的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-25 07:50:40

如果您正在研究如何禁用/抑制模式对话框,如下所示:

然后,您需要阻止C++运行时消息传递,而不是OS崩溃报告。_CrtSetReportMode是您所需要的:

代码语言:javascript
复制
#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);

您仍然有报告,但是这次在调试输出中,非阻塞:

代码语言:javascript
复制
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.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22306820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档