[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...
Hermès BÉLUSCA - MAÏTO
hermes.belusca at sfr.fr
Tue Jan 8 00:55:39 UTC 2013
For the kernel bugcheck I can emit, I've found another code:
FATAL_UNHANDLED_HARD_ERROR, what do you think about it ?
And for usermode, does it exist something else than abort() which doesn't
use the CRT, but which produces the same effects ? The exception will end up
in the exception handler usually, you say, but does it exist something else
that I can use (which can show up a msgbox to connect the debugger as
breakpoint or exception does BUT which stops the program exactly at the
point of the call) ?
-----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 13:52
À : ReactOS Development List
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...
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/debu
>> g .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
>
_______________________________________________
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