[REACTOS]

Introduce four new debugging macros, ERROR_DBGBREAK, ERROR_FATAL, UNIMPLEMENTED_DBGBREAK, UNIMPLEMENTED_FATAL (and two helpers, __NOTICE and __ERROR_DBGBREAK).
They are designed to display on the debug-log a printf-like user-defined message and to break into the debugger.
- The *_DBGBREAK macros break only into the debugger and allow to continue (they don't hang).
- The *_FATAL macros break into the debugger and then halt the execution.

(Based on an idea of Aleksey Bragin, see the ros-dev mailing list about the while(true) --> assert(false); changes).

[NTOSKRNL]
Use these macros instead of ASSERT(FALSE); introduced in revisions r58110, r58111 and r58112 to replace while(TRUE); halts.

Part 1/3

svn path=/trunk/; revision=58132
This commit is contained in:
Hermès Bélusca-Maïto 2013-01-06 18:47:39 +00:00
parent 04c2d31986
commit 34daa9e99c
6 changed files with 93 additions and 81 deletions

View file

@ -3,14 +3,13 @@
* PROJECT: ReactOS kernel
* FILE: include/internal/debug.h
* PURPOSE: Useful debugging macros
* PROGRAMMER: David Welch (welch@mcmail.com)
* UPDATE HISTORY:
* 28/05/98: Created
* PROGRAMMERS: David Welch (welch@mcmail.com)
* Hermes Belusca-Maito (hermes.belusca@sfr.fr)
*/
/*
* NOTE: Define NDEBUG before including this header to disable debugging
* macros
* NOTE: Define NDEBUG before including this header
* to disable debugging macros.
*/
#ifndef __INTERNAL_DEBUG
@ -19,7 +18,7 @@
/* Define DbgPrint/DbgPrintEx/RtlAssert unless the NDK is used */
#if !defined(_RTLFUNCS_H) && !defined(_NTDDK_)
/* Make sure we have basic types (some people include us *before* SDK... */
/* Make sure we have basic types (some people include us *before* SDK)... */
#if !defined(_NTDEF_) && !defined(_NTDEF_H) && !defined(_WINDEF_) && !defined(_WINDEF_H)
#error Please include SDK first.
#endif
@ -56,7 +55,7 @@ RtlAssert(
#ifndef assert
#ifndef NASSERT
#define assert(x) if (!(x)) {RtlAssert((PVOID)#x,(PVOID)__FILE__,__LINE__, ""); }
#define assert(x) if (!(x)) { RtlAssert((PVOID)#x, (PVOID)__FILE__, __LINE__, ""); }
#else
#define assert(x)
#endif
@ -64,7 +63,7 @@ RtlAssert(
#ifndef ASSERT
#ifndef NASSERT
#define ASSERT(x) if (!(x)) {RtlAssert((PVOID)#x,(PVOID)__FILE__,__LINE__, ""); }
#define ASSERT(x) if (!(x)) { RtlAssert((PVOID)#x, (PVOID)__FILE__, __LINE__, ""); }
#else
#define ASSERT(x)
#endif
@ -72,12 +71,15 @@ RtlAssert(
#ifndef ASSERTMSG
#ifndef NASSERT
#define ASSERTMSG(x,m) if (!(x)) {RtlAssert((PVOID)#x,__FILE__,__LINE__, m); }
#define ASSERTMSG(x,m) if (!(x)) { RtlAssert((PVOID)#x, __FILE__, __LINE__, m); }
#else
#define ASSERTMSG(x)
#endif
#endif
/* For internal purposes only */
#define __NOTICE(level, fmt, ...) DbgPrint(#level ": %s at %s:%d " fmt, __FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
/* Print stuff only on Debug Builds*/
#define DPFLTR_DEFAULT_ID -1
#if DBG
@ -102,7 +104,7 @@ RtlAssert(
#endif
#define UNIMPLEMENTED DbgPrint("WARNING: %s at %s:%d is UNIMPLEMENTED!\n",__FUNCTION__,__FILE__,__LINE__);
#define UNIMPLEMENTED __NOTICE(WARNING, "is UNIMPLEMENTED!\n");
#define ERR_(ch, fmt, ...) DbgPrintEx(DPFLTR_##ch##_ID, DPFLTR_ERROR_LEVEL, "(%s:%d) " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#define WARN_(ch, fmt, ...) DbgPrintEx(DPFLTR_##ch##_ID, DPFLTR_WARNING_LEVEL, "(%s:%d) " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
@ -113,6 +115,7 @@ RtlAssert(
#define WARN__(ch, fmt, ...) DbgPrintEx(ch, DPFLTR_WARNING_LEVEL, "(%s:%d) " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#define TRACE__(ch, fmt, ...) DbgPrintEx(ch, DPFLTR_TRACE_LEVEL, "(%s:%d) " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#define INFO__(ch, fmt, ...) DbgPrintEx(ch, DPFLTR_INFO_LEVEL, "(%s:%d) " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#else /* not DBG */
/* On non-debug builds, we never show these */
@ -130,8 +133,52 @@ RtlAssert(
#define WARN__(ch, ...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
#define TRACE__(ch, ...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
#define INFO__(ch, ...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
#endif /* not DBG */
/*
* These macros are designed to display an optional printf-like
* user-defined message and to break into the debugger.
* After that they allow to continue the program execution.
*/
/* For internal purposes only */
#define __ERROR_DBGBREAK(...) \
do { \
DbgPrint("" __VA_ARGS__); \
DbgBreakPoint(); \
} while (0)
#define ERROR_DBGBREAK(...) \
do { \
__NOTICE(ERROR, "\n"); \
__ERROR_DBGBREAK(__VA_ARGS__); \
} while (0)
#define UNIMPLEMENTED_DBGBREAK(...) \
do { \
__NOTICE(ERROR, "is UNIMPLEMENTED!\n"); \
__ERROR_DBGBREAK(__VA_ARGS__); \
} while (0)
/*
* These macros are designed to display an optional printf-like
* user-defined message and to break into the debugger.
* After that they halt the execution of the current thread.
*/
#define ERROR_FATAL(...) \
do { \
__NOTICE(UNRECOVERABLE ERROR, "\n"); \
__ERROR_DBGBREAK(__VA_ARGS__); \
while (TRUE); \
} while (0)
#define UNIMPLEMENTED_FATAL(...) \
do { \
__NOTICE(UNRECOVERABLE ERROR, "is UNIMPLEMENTED!\n"); \
__ERROR_DBGBREAK(__VA_ARGS__); \
while (TRUE); \
} while (0)
#define ASSERT_IRQL_LESS_OR_EQUAL(x) ASSERT(KeGetCurrentIrql()<=(x))
#define ASSERT_IRQL_EQUAL(x) ASSERT(KeGetCurrentIrql()==(x))
#define ASSERT_IRQL_LESS(x) ASSERT(KeGetCurrentIrql()<(x))

View file

@ -65,8 +65,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
//
// Always return success for now
//
DPRINT1("NEVER TELL ME THE ODDS!\n");
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_FATAL("NEVER TELL ME THE ODDS!\n");
return STATUS_SUCCESS;
}

View file

@ -58,8 +58,7 @@ MiSyncCachedRanges(VOID)
/* Scan every range */
for (i = 0; i < MiLargePageRangeIndex; i++)
{
DPRINT1("No support for large pages\n");
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK("No support for large pages\n");
}
}

View file

@ -105,8 +105,7 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr,
if (SessionLoad)
{
/* Fail */
DPRINT1("Session loading not yet supported!\n");
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK("Session loading not yet supported!\n");
return STATUS_NOT_IMPLEMENTED;
}
@ -1217,8 +1216,7 @@ CheckDllState:
{
/* We failed, unload the image */
MmUnloadSystemImage(DllEntry);
DPRINT1("MmCallDllInitialize failed with status 0x%x\n", Status);
ASSERT(FALSE); // while (TRUE);
ERROR_DBGBREAK("MmCallDllInitialize failed with status 0x%x\n", Status);
Loaded = FALSE;
}
}
@ -1720,8 +1718,7 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
if (!PointerPte)
{
/* Shouldn't happen */
DPRINT1("[Mm0]: Couldn't allocate driver section!\n");
ASSERT(FALSE); // while (TRUE);
ERROR_FATAL("[Mm0]: Couldn't allocate driver section!\n");
return;
}
@ -1774,8 +1771,7 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
if (!NT_SUCCESS(Status))
{
/* This shouldn't happen */
DPRINT1("Relocations failed!\n");
ASSERT(FALSE); // while (TRUE);
ERROR_FATAL("Relocations failed!\n");
return;
}
}
@ -1973,9 +1969,8 @@ MiBuildImportsForBootDrivers(VOID)
if (*ImageThunk)
{
/* Should not be happening */
DPRINT1("Broken IAT entry for %p at %p (%lx)\n",
LdrEntry, ImageThunk, *ImageThunk);
ASSERT(FALSE);
ERROR_FATAL("Broken IAT entry for %p at %p (%lx)\n",
LdrEntry, ImageThunk, *ImageThunk);
}
/* Reset if we hit this */
@ -2363,8 +2358,7 @@ MiWriteProtectSystemImage(IN PVOID ImageBase)
else
{
/* Not supported */
DPRINT1("Session drivers not supported\n");
ASSERT(FALSE);
UNIMPLEMENTED_DBGBREAK("Session drivers not supported\n");
}
/* These are the only protection masks we care about */
@ -2924,8 +2918,7 @@ LoaderScan:
else
{
/* We don't support session loading yet */
DPRINT1("Unsupported Session-Load!\n");
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK("Unsupported Session-Load!\n");
Status = STATUS_NOT_IMPLEMENTED;
}
@ -3026,8 +3019,7 @@ LoaderScan:
if (Flags)
{
/* We don't support session loading yet */
DPRINT1("Unsupported Session-Load!\n");
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK("Unsupported Session-Load!\n");
goto Quickie;
}

View file

@ -124,8 +124,7 @@ NTAPI
MiFlushTlb(IN PMMPTE PointerPte,
IN PVOID Address)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
BOOLEAN
@ -134,8 +133,7 @@ MmCreateProcessAddressSpace(IN ULONG MinWs,
IN PEPROCESS Process,
IN PULONG DirectoryTableBase)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return FALSE;
}
@ -164,8 +162,7 @@ MmDisableVirtualMapping(IN PEPROCESS Process,
OUT PBOOLEAN WasDirty,
OUT PPFN_NUMBER Page)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
VOID
@ -173,8 +170,7 @@ NTAPI
MmEnableVirtualMapping(IN PEPROCESS Process,
IN PVOID Address)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
NTSTATUS
@ -185,8 +181,7 @@ MmCreateVirtualMappingUnsafe(IN PEPROCESS Process,
IN PPFN_NUMBER Pages,
IN ULONG PageCount)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return STATUS_SUCCESS;
}
@ -198,8 +193,7 @@ MmCreateVirtualMapping(IN PEPROCESS Process,
IN PPFN_NUMBER Pages,
IN ULONG PageCount)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return STATUS_SUCCESS;
}
@ -207,8 +201,7 @@ VOID
NTAPI
MmRawDeleteVirtualMapping(IN PVOID Address)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
VOID
@ -219,8 +212,7 @@ MmDeleteVirtualMapping(IN PEPROCESS Process,
OUT PBOOLEAN WasDirty,
OUT PPFN_NUMBER Page)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
VOID
@ -229,8 +221,7 @@ MmDeletePageFileMapping(IN PEPROCESS Process,
IN PVOID Address,
IN SWAPENTRY *SwapEntry)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
NTSTATUS
@ -239,8 +230,7 @@ MmCreatePageFileMapping(IN PEPROCESS Process,
IN PVOID Address,
IN SWAPENTRY SwapEntry)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return STATUS_NOT_IMPLEMENTED;
}
@ -249,8 +239,7 @@ NTAPI
MmGetPfnForProcess(IN PEPROCESS Process,
IN PVOID Address)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return 0;
}
@ -259,8 +248,7 @@ NTAPI
MmIsDirtyPage(IN PEPROCESS Process,
IN PVOID Address)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return FALSE;
}
@ -269,8 +257,7 @@ NTAPI
MmSetCleanPage(IN PEPROCESS Process,
IN PVOID Address)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
VOID
@ -278,8 +265,7 @@ NTAPI
MmSetDirtyPage(IN PEPROCESS Process,
IN PVOID Address)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
BOOLEAN
@ -287,8 +273,7 @@ NTAPI
MmIsPagePresent(IN PEPROCESS Process,
IN PVOID Address)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return FALSE;
}
@ -297,8 +282,7 @@ NTAPI
MmIsPageSwapEntry(IN PEPROCESS Process,
IN PVOID Address)
{
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return FALSE;
}
@ -328,7 +312,6 @@ MmInitGlobalKernelPageDirectory(VOID)
ULONG i;
PULONG CurrentPageDirectory = (PULONG)PDE_BASE;
/* Loop the 2GB of address space which belong to the kernel */
for (i = MiGetPdeOffset(MmSystemRangeStart); i < 2048; i++)
{
@ -356,8 +339,7 @@ MmGetPhysicalAddress(IN PVOID Address)
PHYSICAL_ADDRESS PhysicalAddress;
PhysicalAddress.QuadPart = 0;
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return PhysicalAddress;
}

View file

@ -39,7 +39,7 @@ MiUnmapPageTable(IN PMMPTE PointerPde)
//
// FIXME-USER: Shouldn't get here yet
//
ASSERT(FALSE);
ERROR_FATAL();
return FALSE;
}
@ -399,8 +399,7 @@ MmDisableVirtualMapping(IN PEPROCESS Process,
//
// TODO
//
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
VOID
@ -411,8 +410,7 @@ MmEnableVirtualMapping(IN PEPROCESS Process,
//
// TODO
//
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
NTSTATUS
@ -658,8 +656,7 @@ MmDeletePageFileMapping(IN PEPROCESS Process,
//
// TODO
//
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
NTSTATUS
@ -671,8 +668,7 @@ MmCreatePageFileMapping(IN PEPROCESS Process,
//
// TODO
//
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return STATUS_NOT_IMPLEMENTED;
}
@ -703,8 +699,7 @@ MmIsDirtyPage(IN PEPROCESS Process,
//
// TODO
//
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
return FALSE;
}
@ -716,8 +711,7 @@ MmSetCleanPage(IN PEPROCESS Process,
//
// TODO
//
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
VOID
@ -728,8 +722,7 @@ MmSetDirtyPage(IN PEPROCESS Process,
//
// TODO
//
UNIMPLEMENTED;
ASSERT(FALSE); // while (TRUE);
UNIMPLEMENTED_DBGBREAK();
}
BOOLEAN