diff options
Diffstat (limited to 'src/windows/cns/debug.c')
-rw-r--r-- | src/windows/cns/debug.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/windows/cns/debug.c b/src/windows/cns/debug.c new file mode 100644 index 000000000..101fe30b5 --- /dev/null +++ b/src/windows/cns/debug.c @@ -0,0 +1,92 @@ +#ifdef DEBUG +#define _DEBUG + +#include <stdio.h> +#include <string.h> +#include <malloc.h> +#include <crtdbg.h> + +void +OutputHeading(const char *explanation) +{ + _RPT1(_CRT_WARN, + "\n\n%s:\n*********************************\n", explanation ); +} + +/* + * The following macros set and clear, respectively, given bits + * of the C runtime library debug flag, as specified by a bitmask. + */ +#define SET_CRT_DEBUG_FIELD(a) \ + _CrtSetDbgFlag((a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) +#define CLEAR_CRT_DEBUG_FIELD(a) \ + _CrtSetDbgFlag(~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) + +_CrtMemState s1; +_CrtMemState s2; +_CrtMemState s3; +static _CrtMemState *ss1 = NULL; +static _CrtMemState *ss2 = NULL; + +void debug_init(); + +void +debug_check() +{ + _CrtMemState *temp; + + OutputHeading("Checking memory..."); + + if (ss1 == NULL) { + debug_init(); + ss1 = &s1; + ss2 = &s2; + } + + _CrtCheckMemory(); + + /* _CrtMemDumpAllObjectsSince( NULL ); */ + + _CrtMemCheckpoint( &s2 ); + + if ( _CrtMemDifference( &s3, &s1, &s2 ) ) + _CrtMemDumpStatistics( &s3 ); + + /* _CrtDumpMemoryLeaks(); */ + + /* + * swap the snapshots around + */ + temp = ss1; + ss1 = ss2; + ss2 = temp; +} + +void +debug_init() +{ + /* Send all reports to STDOUT */ + _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE ); + _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT ); + _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE ); + _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT ); + _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE ); + _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT ); + + _CrtMemCheckpoint( &s1 ); + + /* + * Set the debug-heap flag so that freed blocks are kept on the + * linked list, to catch any inadvertent use of freed memory + */ + SET_CRT_DEBUG_FIELD( _CRTDBG_DELAY_FREE_MEM_DF ); + + + /* + * Set the debug-heap flag so that memory leaks are reported when + * the process terminates. Then, exit. + */ + SET_CRT_DEBUG_FIELD( _CRTDBG_LEAK_CHECK_DF ); +} +#endif /* DEBUG */ + |