[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
Tue Jan 8 08:11:50 UTC 2013
Am 08.01.2013 01:55, schrieb Hermès BÉLUSCA - MAÏTO:
> For the kernel bugcheck I can emit, I've found another code:
> FATAL_UNHANDLED_HARD_ERROR, what do you think about it ?
It's not exactly what is usually called a "hard error", but I'm fine
with that, too.
> 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
What's wrong with the CRT? Everything uses the CRT.
> 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) ?
Yes assert(), that's why there should be the ASSERT macro before the
abort(), to DBG builds will raise an assertion, which will display a
message box and allow to break into the debugger (which is broken, but
I'll fix it)
>
> -----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
>
> _______________________________________________
> 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