c++ - SetErrorMode and /MDd (/MTd) compile flag -
i need prevent default message box visual studio debugger show during heap corruption. according documentation should simple as:
seterrormode(sem_failcriticalerrors | sem_nogpfaulterrorbox);
however cannot above work. here small toy example:
$ cat hc.cxx #include <windows.h> int main() { seterrormode(sem_failcriticalerrors | sem_nogpfaulterrorbox); char * p = new char[10]; for( int = 0; < 500; ++i ) p[i] = i; delete p; return 0; }
if compile no flag, goes expected (no message box):
$ cl hc.cxx
however if decide use /mdd, annoying message box comes back:
$ cl /mdd hc.cxx
same issue /mtd.
my system windows vista pro/32bits sp2 installed. compiler visual studio 2010, , cl version 16.00.40219.01. setthreaderrormode not available on system.
in case helps understand issue: using cmake+ctest automated testing. ctest parent process (calling seterrormode) execute test. tests submitted cdash (equivalent of jenkins/hudson). if message box heap corruption appears test flagged taking long execute, instead of nicely reporting low level issue. have no control on user compilation flag, , need way prevent message box appear.
if looking how disable/suppress modal dialog this:
then need block c++ runtime messaging rather os crash reporting. _crtsetreportmode
need:
#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);
you still have report, time in debug output, non-blocking:
f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c(1322) : assertion failed: _crtisvalidheappointer(puserdata) heap corruption detected: after normal block (#161) @ 0x002d2448. crt detected application wrote memory after end of heap buffer. heap[consoleapplication11.exe]: heap block @ 002d2420 modified @ 002d2456 past requested size of 2e consoleapplication11.exe has triggered breakpoint. heap[consoleapplication11.exe]: invalid address specified rtlfreeheap( 002d0000, 002d2428 ) consoleapplication11.exe has triggered breakpoint.
Comments
Post a Comment