ReactOS 0.4.15-dev-6042-g2eb6700
dbgrpt.cpp File Reference
#include <crtdbg.h>
#include <stdio.h>
#include <signal.h>
#include <windows.h>
Include dependency graph for dbgrpt.cpp:

Go to the source code of this file.

Classes

struct  dbgrpt_char_traits< char >
 
struct  dbgrpt_char_traits< wchar_t >
 

Macros

#define DBGRPT_MAX_BUFFER_SIZE   4096
 
#define DBGRPT_ASSERT_PREFIX_MESSAGE   "Assertion failed: "
 
#define DBGRPT_ASSERT_PREFIX_NOMESSAGE   "Assertion failed!"
 
#define DBGRPT_STRING_TOO_LONG   "_CrtDbgReport: String too long"
 

Typedefs

typedef int(WINAPItMessageBoxW) (_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
 
typedef dbgrpt_char_traits< charachar_traits
 
typedef dbgrpt_char_traits< wchar_twchar_traits
 

Functions

static HMODULE _CrtGetUser32 ()
 
static tMessageBoxW _CrtGetMessageBox ()
 
template<typename char_t >
static int _CrtDbgReportWindow (int reportType, const char_t *filename, int linenumber, const char_t *moduleName, const char_t *message)
 
template<typename char_t >
static int _CrtEnterDbgReport (int reportType, const char_t *filename, int linenumber)
 
static void _CrtLeaveDbgReport (int reportType)
 
template<typename char_t >
static int _CrtHandleDbgReport (int reportType, const char_t *szCompleteMessage, const char_t *szFormatted, const char_t *filename, int linenumber, const char_t *moduleName)
 
EXTERN_C int __cdecl _CrtDbgReport (int reportType, const char *filename, int linenumber, const char *moduleName, const char *format,...)
 
EXTERN_C int __cdecl _CrtDbgReportW (int reportType, const wchar_t *filename, int linenumber, const wchar_t *moduleName, const wchar_t *format,...)
 

Variables

static long _CrtInAssert = -1
 
static int _CrtModeOutputFormat [_CRT_ERRCNT]
 
static const wchar_t_CrtModeMessages [_CRT_ERRCNT]
 
static HMODULE _CrtUser32Handle = NULL
 
static tMessageBoxW _CrtMessageBoxW = NULL
 

Macro Definition Documentation

◆ DBGRPT_ASSERT_PREFIX_MESSAGE

#define DBGRPT_ASSERT_PREFIX_MESSAGE   "Assertion failed: "

Definition at line 21 of file dbgrpt.cpp.

◆ DBGRPT_ASSERT_PREFIX_NOMESSAGE

#define DBGRPT_ASSERT_PREFIX_NOMESSAGE   "Assertion failed!"

Definition at line 22 of file dbgrpt.cpp.

◆ DBGRPT_MAX_BUFFER_SIZE

#define DBGRPT_MAX_BUFFER_SIZE   4096

Definition at line 20 of file dbgrpt.cpp.

◆ DBGRPT_STRING_TOO_LONG

#define DBGRPT_STRING_TOO_LONG   "_CrtDbgReport: String too long"

Definition at line 23 of file dbgrpt.cpp.

Typedef Documentation

◆ achar_traits

Definition at line 75 of file dbgrpt.cpp.

◆ tMessageBoxW

typedef int(WINAPI * tMessageBoxW) (_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)

Definition at line 43 of file dbgrpt.cpp.

◆ wchar_traits

Definition at line 76 of file dbgrpt.cpp.

Function Documentation

◆ _CrtDbgReport()

EXTERN_C int __cdecl _CrtDbgReport ( int  reportType,
const char filename,
int  linenumber,
const char moduleName,
const char format,
  ... 
)

Definition at line 264 of file dbgrpt.cpp.

265{
266 char szFormatted[DBGRPT_MAX_BUFFER_SIZE+1] = {0}; // The user provided message
267 char szCompleteMessage[(DBGRPT_MAX_BUFFER_SIZE+1)*2] = {0}; // The output for debug / file
268
269 // Check for recursive _CrtDbgReport calls, and validate reportType
270 if (!_CrtEnterDbgReport(reportType, filename, linenumber))
271 return -1;
272
273 if (filename)
274 {
275 _snprintf(szCompleteMessage, DBGRPT_MAX_BUFFER_SIZE, "%s(%d) : ", filename, linenumber);
276 }
277
278 if (format)
279 {
284
285 if (len < 0)
286 {
287 strcpy(szFormatted, DBGRPT_STRING_TOO_LONG);
288 }
289
290 if (reportType == _CRT_ASSERT)
291 strcat(szCompleteMessage, DBGRPT_ASSERT_PREFIX_MESSAGE);
292 strcat(szCompleteMessage, szFormatted);
293 }
294 else if (reportType == _CRT_ASSERT)
295 {
296 strcat(szCompleteMessage, DBGRPT_ASSERT_PREFIX_NOMESSAGE);
297 }
298
299 if (reportType == _CRT_ASSERT)
300 {
301 if (_CrtModeOutputFormat[reportType] & _CRTDBG_MODE_FILE)
302 strcat(szCompleteMessage, "\r");
303 strcat(szCompleteMessage, "\n");
304 }
305
306 // FIXME: Handle user report hooks here
307
308 int nResult = _CrtHandleDbgReport(reportType, szCompleteMessage, szFormatted, filename, linenumber, moduleName);
309
310 _CrtLeaveDbgReport(reportType);
311
312 return nResult;
313}
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define _CRT_ASSERT
Definition: crtdbg.h:21
#define _CRTDBG_MODE_FILE
Definition: crtdbg.h:24
#define DBGRPT_MAX_BUFFER_SIZE
Definition: dbgrpt.cpp:20
static void _CrtLeaveDbgReport(int reportType)
Definition: dbgrpt.cpp:218
static int _CrtHandleDbgReport(int reportType, const char_t *szCompleteMessage, const char_t *szFormatted, const char_t *filename, int linenumber, const char_t *moduleName)
Definition: dbgrpt.cpp:226
#define DBGRPT_STRING_TOO_LONG
Definition: dbgrpt.cpp:23
static int _CrtEnterDbgReport(int reportType, const char_t *filename, int linenumber)
Definition: dbgrpt.cpp:187
#define DBGRPT_ASSERT_PREFIX_MESSAGE
Definition: dbgrpt.cpp:21
#define DBGRPT_ASSERT_PREFIX_NOMESSAGE
Definition: dbgrpt.cpp:22
static int _CrtModeOutputFormat[_CRT_ERRCNT]
Definition: dbgrpt.cpp:28
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
GLenum GLsizei len
Definition: glext.h:6722
const char * filename
Definition: ioapi.h:137
va_lists_t arglist[FMT_ARGMAX+1]
Definition: format.c:284
#define _vsnprintf
Definition: xmlstorage.h:202
#define _snprintf
Definition: xmlstorage.h:200

◆ _CrtDbgReportW()

EXTERN_C int __cdecl _CrtDbgReportW ( int  reportType,
const wchar_t filename,
int  linenumber,
const wchar_t moduleName,
const wchar_t format,
  ... 
)

Definition at line 316 of file dbgrpt.cpp.

317{
318 wchar_t szFormatted[DBGRPT_MAX_BUFFER_SIZE+1] = {0}; // The user provided message
319 wchar_t szCompleteMessage[(DBGRPT_MAX_BUFFER_SIZE+1)*2] = {0}; // The output for debug / file
320
321 // Check for recursive _CrtDbgReportW calls, and validate reportType
322 if (!_CrtEnterDbgReport(reportType, filename, linenumber))
323 return -1;
324
325 if (filename)
326 {
327 _snwprintf(szCompleteMessage, DBGRPT_MAX_BUFFER_SIZE, L"%s(%d) : ", filename, linenumber);
328 }
329
330 if (format)
331 {
336
337 if (len < 0)
338 {
340 }
341
342 if (reportType == _CRT_ASSERT)
343 wcscat(szCompleteMessage, _CRT_WIDE(DBGRPT_ASSERT_PREFIX_MESSAGE));
344 wcscat(szCompleteMessage, szFormatted);
345 }
346 else if (reportType == _CRT_ASSERT)
347 {
349 }
350
351 if (reportType == _CRT_ASSERT)
352 {
353 if (_CrtModeOutputFormat[reportType] & _CRTDBG_MODE_FILE)
354 wcscat(szCompleteMessage, L"\r");
355 wcscat(szCompleteMessage, L"\n");
356 }
357
358 // FIXME: Handle user report hooks here
359
360 int nResult = _CrtHandleDbgReport(reportType, szCompleteMessage, szFormatted, filename, linenumber, moduleName);
361
362 _CrtLeaveDbgReport(reportType);
363
364 return nResult;
365}
#define _CRT_WIDE(_String)
Definition: crtdefs.h:55
_CRTIMP int __cdecl _vsnwprintf(wchar_t *_Dest, size_t _Count, const wchar_t *_Format, va_list _Args)
int _snwprintf(wchar_t *buffer, size_t count, const wchar_t *format,...)
#define L(x)
Definition: ntvdm.h:50
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)

◆ _CrtDbgReportWindow()

template<typename char_t >
static int _CrtDbgReportWindow ( int  reportType,
const char_t *  filename,
int  linenumber,
const char_t *  moduleName,
const char_t *  message 
)
static

Definition at line 148 of file dbgrpt.cpp.

149{
150 typedef dbgrpt_char_traits<char_t> traits;
151
152 wchar_t szCompleteMessage[(DBGRPT_MAX_BUFFER_SIZE+1)*2] = {0};
153 wchar_t LineBuffer[20] = {0};
154
155 if (filename && !filename[0])
156 filename = NULL;
157 if (moduleName && !moduleName[0])
158 moduleName = NULL;
159 if (message && !message[0])
160 message = NULL;
161 if (linenumber)
162 _itow(linenumber, LineBuffer, 10);
163
164 _snwprintf(szCompleteMessage, DBGRPT_MAX_BUFFER_SIZE * 2,
165 traits::szAssertionMessage,
166 _CrtModeMessages[reportType],
167 moduleName ? L"\nModule: " : L"", moduleName ? moduleName : traits::szEmptyString,
168 filename ? L"\nFile: " : L"", filename ? filename : traits::szEmptyString,
169 LineBuffer[0] ? L"\nLine: " : L"", LineBuffer[0] ? LineBuffer : L"",
170 message ? L"\n\n" : L"", message ? message : traits::szEmptyString);
171
172 if (IsDebuggerPresent())
173 {
174 OutputDebugStringW(szCompleteMessage);
175 }
176
177 tMessageBoxW messageBox = _CrtGetMessageBox();
178 if (!messageBox)
179 return IsDebuggerPresent() ? IDRETRY : IDABORT;
180
181 // TODO: If we are not interacive, add MB_SERVICE_NOTIFICATION
182 return messageBox(NULL, szCompleteMessage, L"ReactOS C++ Runtime Library",
184}
int(WINAPI * tMessageBoxW)(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
Definition: dbgrpt.cpp:43
static tMessageBoxW _CrtGetMessageBox()
Definition: dbgrpt.cpp:130
static const wchar_t * _CrtModeMessages[_CRT_ERRCNT]
Definition: dbgrpt.cpp:35
#define NULL
Definition: types.h:112
void WINAPI SHIM_OBJ_NAME() OutputDebugStringW(LPCWSTR lpOutputString)
Definition: ignoredbgout.c:23
_CRTIMP wchar_t *__cdecl _itow(_In_ int _Value, _Pre_notnull_ _Post_z_ wchar_t *_Dest, _In_ int _Radix)
Definition: tftpd.h:60
BOOL WINAPI IsDebuggerPresent(void)
Definition: debugger.c:580
#define MB_SETFOREGROUND
Definition: winuser.h:808
#define MB_ICONHAND
Definition: winuser.h:782
#define MB_TASKMODAL
Definition: winuser.h:810
#define MB_ABORTRETRYIGNORE
Definition: winuser.h:785
#define IDABORT
Definition: winuser.h:826
#define IDRETRY
Definition: winuser.h:827

Referenced by _CrtHandleDbgReport().

◆ _CrtEnterDbgReport()

template<typename char_t >
static int _CrtEnterDbgReport ( int  reportType,
const char_t *  filename,
int  linenumber 
)
static

Definition at line 187 of file dbgrpt.cpp.

188{
189 typedef dbgrpt_char_traits<char_t> traits;
190
191 if (reportType < 0 || reportType >= _CRT_ERRCNT)
192 return FALSE;
193
194 if (reportType == _CRT_ASSERT)
195 {
197 {
198 char LineBuffer[20] = {0};
199
200 _itoa(linenumber, LineBuffer, 10);
201
202 OutputDebugStringA("Nested Assert from File: ");
203 traits::OutputDebugString(filename ? filename : traits::szUnknownFile);
204 OutputDebugStringA(", Line: ");
205 OutputDebugStringA(LineBuffer);
206 OutputDebugStringA("\n");
207
208 _CrtDbgBreak();
209
211 return FALSE;
212 }
213 }
214 return TRUE;
215}
#define _CRT_ERRCNT
Definition: crtdbg.h:22
#define _CrtDbgBreak()
Definition: crtdbg.h:100
static long _CrtInAssert
Definition: dbgrpt.cpp:26
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
void WINAPI SHIM_OBJ_NAME() OutputDebugStringA(LPCSTR lpOutputString)
Definition: ignoredbgout.c:18
_CRTIMP char *__cdecl _itoa(_In_ int _Value, _Pre_notnull_ _Post_z_ char *_Dest, _In_ int _Radix)
long __cdecl _InterlockedIncrement(_Interlocked_operand_ long volatile *_Addend)
long __cdecl _InterlockedDecrement(_Interlocked_operand_ long volatile *_Addend)

Referenced by _CrtDbgReport(), and _CrtDbgReportW().

◆ _CrtGetMessageBox()

static tMessageBoxW _CrtGetMessageBox ( )
static

Definition at line 130 of file dbgrpt.cpp.

131{
133
135 {
137 if (proc == NULL)
139
141 }
142
144}
static tMessageBoxW _CrtMessageBoxW
Definition: dbgrpt.cpp:45
static HMODULE _CrtGetUser32()
Definition: dbgrpt.cpp:112
#define GetProcAddress(x, y)
Definition: compat.h:753
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
static int mod
Definition: i386-dis.c:1288
void * _InterlockedCompareExchangePointer(_Interlocked_operand_ void *volatile *_Destination, void *_Exchange, void *_Comparand)
static HANDLE proc()
Definition: pdb.c:34

Referenced by _CrtDbgReportWindow().

◆ _CrtGetUser32()

static HMODULE _CrtGetUser32 ( )
static

Definition at line 112 of file dbgrpt.cpp.

113{
114 if (_CrtUser32Handle == NULL)
115 {
116 HMODULE mod = LoadLibraryExW(L"user32.dll", NULL, 0 /* NT6+: LOAD_LIBRARY_SEARCH_SYSTEM32 */);
117 if (mod == NULL)
119
121 {
124 }
125 }
126
128}
static HMODULE _CrtUser32Handle
Definition: dbgrpt.cpp:44
#define FreeLibrary(x)
Definition: compat.h:748
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: loader.c:288
HANDLE HMODULE
Definition: typedefs.h:77

Referenced by _CrtGetMessageBox().

◆ _CrtHandleDbgReport()

template<typename char_t >
static int _CrtHandleDbgReport ( int  reportType,
const char_t *  szCompleteMessage,
const char_t *  szFormatted,
const char_t *  filename,
int  linenumber,
const char_t *  moduleName 
)
static

Definition at line 226 of file dbgrpt.cpp.

228{
229 typedef dbgrpt_char_traits<char_t> traits;
230
231 if (_CrtModeOutputFormat[reportType] & _CRTDBG_MODE_FILE)
232 {
233 OutputDebugStringA("ERROR: Please implement _CrtSetReportFile first\n");
234 _CrtDbgBreak();
235 }
236
238 {
239 traits::OutputDebugString(szCompleteMessage);
240 }
241
242 if (_CrtModeOutputFormat[reportType] & _CRTDBG_MODE_WNDW)
243 {
244 int nResult = _CrtDbgReportWindow(reportType, filename, linenumber, moduleName, szFormatted);
245 switch (nResult)
246 {
247 case IDRETRY:
248 return TRUE;
249 case IDIGNORE:
250 default:
251 return FALSE;
252 case IDABORT:
253 raise(SIGABRT);
254 _exit(3);
255 return FALSE; // Unreachable
256 }
257 }
258
259 return FALSE;
260}
void _exit(int exitcode)
Definition: _exit.c:25
int __cdecl raise(int _SigNum)
Definition: signal.c:71
#define SIGABRT
Definition: signal.h:28
#define _CRTDBG_MODE_DEBUG
Definition: crtdbg.h:25
#define _CRTDBG_MODE_WNDW
Definition: crtdbg.h:26
static int _CrtDbgReportWindow(int reportType, const char_t *filename, int linenumber, const char_t *moduleName, const char_t *message)
Definition: dbgrpt.cpp:148
#define IDIGNORE
Definition: winuser.h:828

Referenced by _CrtDbgReport(), and _CrtDbgReportW().

◆ _CrtLeaveDbgReport()

static void _CrtLeaveDbgReport ( int  reportType)
static

Definition at line 218 of file dbgrpt.cpp.

219{
220 if (reportType == _CRT_ASSERT)
222}

Referenced by _CrtDbgReport(), and _CrtDbgReportW().

Variable Documentation

◆ _CrtInAssert

long _CrtInAssert = -1
static

Definition at line 26 of file dbgrpt.cpp.

Referenced by _CrtEnterDbgReport(), and _CrtLeaveDbgReport().

◆ _CrtMessageBoxW

tMessageBoxW _CrtMessageBoxW = NULL
static

Definition at line 45 of file dbgrpt.cpp.

Referenced by _CrtGetMessageBox().

◆ _CrtModeMessages

const wchar_t* _CrtModeMessages[_CRT_ERRCNT]
static
Initial value:
=
{
L"Warning",
L"Error",
L"Assertion Failed"
}

Definition at line 35 of file dbgrpt.cpp.

Referenced by _CrtDbgReportWindow().

◆ _CrtModeOutputFormat

int _CrtModeOutputFormat[_CRT_ERRCNT]
static
Initial value:

Definition at line 28 of file dbgrpt.cpp.

Referenced by _CrtDbgReport(), _CrtDbgReportW(), and _CrtHandleDbgReport().

◆ _CrtUser32Handle

HMODULE _CrtUser32Handle = NULL
static

Definition at line 44 of file dbgrpt.cpp.

Referenced by _CrtGetUser32().