xref: /reactos/sdk/lib/rtl/assert.c (revision d5399189)
1 /*
2  * COPYRIGHT:         See COPYING in the top level directory
3  * PROJECT:           ReactOS Run-Time Library
4  * PURPOSE:           Implements RtlAssert used by the ASSERT
5  *                    and ASSERTMSG debugging macros
6  * FILE:              lib/rtl/assert.c
7  * PROGRAMERS:        Stefan Ginsberg (stefan.ginsberg@reactos.org)
8  */
9 
10 /* INCLUDES *****************************************************************/
11 
12 #include <rtl.h>
13 #define NDEBUG
14 #include <debug.h>
15 
16 /* PUBLIC FUNCTIONS **********************************************************/
17 
18 /*
19  * @implemented
20  */
21 VOID
22 NTAPI
23 RtlAssert(IN PVOID FailedAssertion,
24           IN PVOID FileName,
25           IN ULONG LineNumber,
26           IN PCHAR Message OPTIONAL)
27 {
28     CHAR Action[2];
29     CONTEXT Context;
30 
31     /* Capture caller's context for the debugger */
32     RtlCaptureContext(&Context);
33 
34     /* Enter prompt loop */
35     for (;;)
36     {
37         /* Print the assertion */
38         DbgPrint("\n*** Assertion failed: %s%s\n"
39                  "***   Source File: %s, line %lu\n\n",
40                  Message != NULL ? Message : "",
41                  (PSTR)FailedAssertion,
42                  (PSTR)FileName,
43                  LineNumber);
44 
45         /* Prompt for action */
46         DbgPrompt("Break repeatedly, break Once, Ignore,"
47                   " terminate Process or terminate Thread (boipt)? ",
48                   Action,
49                   sizeof(Action));
50         switch (Action[0])
51         {
52             /* Break repeatedly */
53             case 'B': case 'b':
54 
55                 /* Do a breakpoint, then prompt again */
56                 DbgPrint("Execute '.cxr %p' to dump context\n", &Context);
57                 DbgBreakPoint();
58                 break;
59 
60             /* Ignore */
61             case 'I': case 'i':
62 
63                 /* Return to caller */
64                 return;
65 
66             /* Break once */
67             case 'O': case 'o':
68 
69                 /* Do a breakpoint and return */
70                 DbgPrint("Execute '.cxr %p' to dump context\n", &Context);
71                 DbgBreakPoint();
72                 return;
73 
74             /* Terminate process*/
75             case 'P': case 'p':
76 
77                 /* Terminate us */
78                 ZwTerminateProcess(ZwCurrentProcess(), STATUS_UNSUCCESSFUL);
79                 break;
80 
81             /* Terminate thread */
82             case 'T': case 't':
83 
84                 /* Terminate us */
85                 ZwTerminateThread(ZwCurrentThread(), STATUS_UNSUCCESSFUL);
86                 break;
87 
88             /* Unrecognized */
89             default:
90 
91                 /* Prompt again */
92                 break;
93         }
94     }
95 
96     /* Shouldn't get here */
97     DbgBreakPoint();
98     ZwTerminateProcess(ZwCurrentProcess(), STATUS_UNSUCCESSFUL);
99 }
100