[ros-dev] [ros-diffs] [hbelusca] 58135: [REACTOS] - Fix the debugging macros I've introduced in r58132; in particular do not use while(true); for forbidding the user to continue execution, but instead raise an exception...
Timo Kreuzer
timo.kreuzer at web.de
Mon Jan 7 12:52:08 UTC 2013
We can use KeBugCheck / abort:
// for debug and release
#if kernelmode
#define FATAL() KeBugCheck(CRITICAL_SERVICE_FAILED) // <= didn't find a
better bugcheck code
#else
#define FATAL() abort();
#endif
or implement some Rtl function for that
#define UNIMPLEMENTED_FATAL() \
UNIMPLEMENTED;
ASSERT(FALSE);
FATAL()
Am 07.01.2013 01:55, schrieb Hermès BÉLUSCA - MAÏTO:
> Have you another solution in mind, to stop execution at this place BUT
> without being able to do 'cont' to continue the execution, when using the
> *_FATAL macros ? (the *_DBGBREAK macros should be fine, see my very last
> commit).
>
> Hermès
>
> -----Message d'origine-----
> De : ros-dev-bounces at reactos.org [mailto:ros-dev-bounces at reactos.org] De la
> part de Timo Kreuzer
> Envoyé : lundi 7 janvier 2013 01:14
> À : ros-dev at reactos.org
> Objet : Re: [ros-dev] [ros-diffs] [hbelusca] 58135: [REACTOS] - Fix the
> debugging macros I've introduced in r58132; in particular do not use
> while(true); for forbidding the user to continue execution, but instead
> raise an exception...
>
>
> I see a problem with this change.
> A debug breakpoint will always break into the debugger exactly where it is.
> Like an ASSERT does.
> But an exception will usually end up in the installed exception handler.
> This does not really help with figuring out what went wrong.
>
> Am 07.01.2013 00:29, schrieb hbelusca at svn.reactos.org:
>> Author: hbelusca
>> Date: Sun Jan 6 23:29:05 2013
>> New Revision: 58135
>>
>> URL: http://svn.reactos.org/svn/reactos?rev=58135&view=rev
>> Log:
>> [REACTOS]
>> - Fix the debugging macros I've introduced in r58132; in particular do not
> use while(true); for forbidding the user to continue execution, but instead
> raise an exception with EXCEPTION_NONCONTINUABLE flag (included when called
> RtlRaiseStatus).
>> - Adjust the definition of RtlRaiseStatus (in kernel-mode it is
> ExRaiseStatus which is used).
>> Modified:
>> trunk/reactos/include/reactos/debug.h
>>
>> Modified: trunk/reactos/include/reactos/debug.h
>> URL:
>> http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/debug
>> .h?rev=58135&r1=58134&r2=58135&view=diff
>> ======================================================================
>> ========
>> --- trunk/reactos/include/reactos/debug.h [iso-8859-1] (original)
>> +++ trunk/reactos/include/reactos/debug.h [iso-8859-1] Sun Jan 6
>> +++ 23:29:05 2013
>> @@ -15,7 +15,7 @@
>> #ifndef __INTERNAL_DEBUG
>> #define __INTERNAL_DEBUG
>>
>> -/* Define DbgPrint/DbgPrintEx/RtlAssert unless the NDK is used */
>> +/* Define DbgPrint/DbgPrintEx/RtlAssert/RtlRaiseStatus unless the NDK
>> +is used */
>> #if !defined(_RTLFUNCS_H) && !defined(_NTDDK_)
>>
>> /* Make sure we have basic types (some people include us *before*
>> SDK)... */ @@ -51,7 +51,27 @@
>> PCHAR Message
>> );
>>
>> +#ifndef _NTDEF_ /* Guard against redefinition from ntdef.h */
>> + typedef _Return_type_success_(return >= 0) LONG NTSTATUS; #endif
>> +__analysis_noreturn NTSYSAPI VOID NTAPI RtlRaiseStatus(
>> + _In_ NTSTATUS Status
>> +);
>> +
>> #endif /* !defined(_RTLFUNCS_H) && !defined(_NTDDK_) */
>> +
>> +
>> +/* Fix usage of RtlRaiseStatus */
>> +#if !defined(_RTLFUNCS_H) && defined(_NTDDK_)
>> + #define RaiseStatus ExRaiseStatus #else
>> + #define RaiseStatus RtlRaiseStatus #endif /*
>> +!defined(_RTLFUNCS_H) && defined(_NTDDK_) */
>> +
>>
>> #ifndef assert
>> #ifndef NASSERT
>> @@ -136,11 +156,7 @@
>>
>> #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 { \
>> @@ -148,6 +164,18 @@
>> DbgBreakPoint(); \
>> } while (0)
>>
>> +/* For internal purposes only */
>> +#define __ERROR_FATAL(Status, ...) \
>> +do { \
>> + DbgPrint("" __VA_ARGS__); \
>> + RaiseStatus((Status)); \
>> +} while (0)
>> +
>> +/*
>> + * 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.
>> + */
>> #define ERROR_DBGBREAK(...) \
>> do { \
>> __NOTICE(ERROR, "\n"); \
>> @@ -165,19 +193,18 @@
>> * 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); \
>> +#define ERROR_FATAL(...) \
>> +do { \
>> + __NOTICE(UNRECOVERABLE ERROR, "\n"); \
>> + __ERROR_FATAL(STATUS_ASSERTION_FAILURE, __VA_ARGS__); \
>> } while (0)
>>
>> #define UNIMPLEMENTED_FATAL(...) \
>> do { \
>> __NOTICE(UNRECOVERABLE ERROR, "is UNIMPLEMENTED!\n"); \
>> - __ERROR_DBGBREAK(__VA_ARGS__); \
>> - while (TRUE); \
>> -} while (0)
>> + __ERROR_FATAL(STATUS_NOT_IMPLEMENTED, __VA_ARGS__); \
>> +} while (0)
>> +/********************************************************************
>> +**********/
>>
>> #define ASSERT_IRQL_LESS_OR_EQUAL(x) ASSERT(KeGetCurrentIrql()<=(x))
>> #define ASSERT_IRQL_EQUAL(x) ASSERT(KeGetCurrentIrql()==(x))
>>
>>
>>
>
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.org
> http://www.reactos.org/mailman/listinfo/ros-dev
>
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.org
> http://www.reactos.org/mailman/listinfo/ros-dev
>
More information about the Ros-dev
mailing list