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 : [email protected] [mailto:[email protected]] 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 : [email protected] [mailto:[email protected]] > De la part de Timo Kreuzer Envoyé : lundi 7 janvier 2013 01:14 À : > [email protected] 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 [email protected]: >> 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 > [email protected] > http://www.reactos.org/mailman/listinfo/ros-dev > > _______________________________________________ > Ros-dev mailing list > [email protected] > http://www.reactos.org/mailman/listinfo/ros-dev > _______________________________________________ Ros-dev mailing list [email protected] http://www.reactos.org/mailman/listinfo/ros-dev _______________________________________________ Ros-dev mailing list [email protected] http://www.reactos.org/mailman/listinfo/ros-dev
