簡體   English   中英

SetErrorMode和/ MDd(/ MTd)編譯標志

[英]SetErrorMode and /MDd (/MTd) compile flag

我需要防止Visual Studio調試器中的默認消息框在堆損壞期間顯示。 根據文檔,它應該很簡單:

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)。 但是,如果出現堆損壞消息框,則將測試標記為執行時間過長,而不是很好地報告低級問題。 我無法控制用戶編譯標志,只需要一種防止消息框出現的方法即可。

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

在此處輸入圖片說明

然后,您需要阻止C ++運行時消息傳遞,而不是OS崩潰報告。 _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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM