mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 17:44:45 +00:00
- Made KeBugCheckEx into a call to KeBugCheckExWithTf.
- If file logging is in use then dump the last messages from the ringbuffer on a bugcheck so the user can see them if the system was in graphics mode when it crashed. svn path=/trunk/; revision=8653
This commit is contained in:
parent
14a834a699
commit
01d3124925
3 changed files with 57 additions and 87 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $Id: kd.h,v 1.23 2004/02/24 21:25:41 weiden Exp $
|
||||
/* $Id: kd.h,v 1.24 2004/03/11 21:50:23 dwelch Exp $
|
||||
*
|
||||
* kernel debugger prototypes
|
||||
*/
|
||||
|
@ -120,5 +120,7 @@ KD_CONTINUE_TYPE
|
|||
KdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
|
||||
PCONTEXT Context,
|
||||
PKTRAP_FRAME TrapFrame);
|
||||
VOID
|
||||
DebugLogDumpMessages(VOID);
|
||||
|
||||
#endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: dlog.c,v 1.12 2004/03/07 04:38:41 dwelch Exp $
|
||||
/* $Id: dlog.c,v 1.13 2004/03/11 21:50:23 dwelch Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -35,6 +35,38 @@ static KEVENT DebugLogEvent;
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
VOID
|
||||
DebugLogDumpMessages(VOID)
|
||||
{
|
||||
static CHAR Buffer[256];
|
||||
ULONG Offset;
|
||||
ULONG Length;
|
||||
|
||||
if (!(KdDebugState & KD_DEBUG_FILELOG))
|
||||
{
|
||||
return;
|
||||
}
|
||||
KdDebugState &= ~KD_DEBUG_FILELOG;
|
||||
|
||||
Offset = (DebugLogEnd + 1) % DEBUGLOG_SIZE;
|
||||
do
|
||||
{
|
||||
if (Offset <= DebugLogEnd)
|
||||
{
|
||||
Length = min(255, DebugLogEnd - Offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
Length = min(255, DEBUGLOG_SIZE - Offset);
|
||||
}
|
||||
memcpy(Buffer, DebugLog + Offset, Length);
|
||||
Buffer[Length] = 0;
|
||||
DbgPrint(Buffer);
|
||||
Offset = (Offset + Length) % DEBUGLOG_SIZE;
|
||||
}
|
||||
while (Length > 0);
|
||||
}
|
||||
|
||||
VOID INIT_FUNCTION
|
||||
DebugLogInit(VOID)
|
||||
{
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: bug.c,v 1.43 2004/03/09 21:49:53 dwelch Exp $
|
||||
/* $Id: bug.c,v 1.44 2004/03/11 21:50:24 dwelch Exp $
|
||||
*
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE: ntoskrnl/ke/bug.c
|
||||
|
@ -104,6 +104,7 @@ KeBugCheckWithTf(ULONG BugCheckCode,
|
|||
}
|
||||
|
||||
Ke386DisableInterrupts();
|
||||
DebugLogDumpMessages();
|
||||
|
||||
if (KeGetCurrentIrql() < DISPATCH_LEVEL)
|
||||
{
|
||||
|
@ -138,8 +139,23 @@ KeBugCheckWithTf(ULONG BugCheckCode,
|
|||
DbgPrint("Recursive bug check halting now\n");
|
||||
Ke386HaltProcessor();
|
||||
}
|
||||
InBugCheck = 1;
|
||||
KiDumpTrapFrame(Tf, BugCheckParameter1, BugCheckParameter2);
|
||||
InBugCheck = 1;
|
||||
if (Tf != NULL)
|
||||
{
|
||||
KiDumpTrapFrame(Tf, BugCheckParameter1, BugCheckParameter2);
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(__GNUC__)
|
||||
KeDumpStackFrames((PULONG)__builtin_frame_address(0));
|
||||
#elif defined(_MSC_VER)
|
||||
__asm push ebp
|
||||
__asm call KeDumpStackFrames
|
||||
__asm add esp, 4
|
||||
#else
|
||||
#error Unknown compiler for inline assembler
|
||||
#endif
|
||||
}
|
||||
MmDumpToPagingFile(BugCheckCode, BugCheckParameter1,
|
||||
BugCheckParameter2, BugCheckParameter3,
|
||||
BugCheckParameter4, Tf);
|
||||
|
@ -175,88 +191,8 @@ KeBugCheckEx(ULONG BugCheckCode,
|
|||
* RETURNS: Doesn't
|
||||
*/
|
||||
{
|
||||
PRTL_MESSAGE_RESOURCE_ENTRY Message;
|
||||
NTSTATUS Status;
|
||||
KIRQL OldIrql;
|
||||
|
||||
/* Make sure we're switching back to the blue screen and print messages on it */
|
||||
HalReleaseDisplayOwnership();
|
||||
if (0 == (KdDebugState & KD_DEBUG_GDB))
|
||||
{
|
||||
KdDebugState |= KD_DEBUG_SCREEN;
|
||||
}
|
||||
|
||||
Ke386DisableInterrupts();
|
||||
|
||||
if (KeGetCurrentIrql() < DISPATCH_LEVEL)
|
||||
{
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
}
|
||||
DbgPrint("Bug detected (code %x param %x %x %x %x)\n",
|
||||
BugCheckCode,
|
||||
BugCheckParameter1,
|
||||
BugCheckParameter2,
|
||||
BugCheckParameter3,
|
||||
BugCheckParameter4);
|
||||
|
||||
Status = RtlFindMessage((PVOID)KERNEL_BASE, //0xC0000000,
|
||||
11, //RT_MESSAGETABLE,
|
||||
0x09, //0x409,
|
||||
BugCheckCode,
|
||||
&Message);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
if (Message->Flags == 0)
|
||||
DbgPrint(" %s\n", Message->Text);
|
||||
else
|
||||
DbgPrint(" %S\n", (PWSTR)Message->Text);
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgPrint(" No message text found!\n\n");
|
||||
}
|
||||
|
||||
if (InBugCheck == 1)
|
||||
{
|
||||
DbgPrint("Recursive bug check halting now\n");
|
||||
Ke386HaltProcessor();
|
||||
}
|
||||
InBugCheck = 1;
|
||||
if (PsGetCurrentProcess() != NULL)
|
||||
{
|
||||
DbgPrint("Pid: %x <", PsGetCurrentProcess()->UniqueProcessId);
|
||||
DbgPrint("%.8s> ", PsGetCurrentProcess()->ImageFileName);
|
||||
}
|
||||
if (PsGetCurrentThread() != NULL)
|
||||
{
|
||||
DbgPrint("Thrd: %x Tid: %x\n",
|
||||
PsGetCurrentThread(),
|
||||
PsGetCurrentThread()->Cid.UniqueThread);
|
||||
}
|
||||
#if defined(__GNUC__)
|
||||
KeDumpStackFrames((PULONG)__builtin_frame_address(0));
|
||||
#elif defined(_MSC_VER)
|
||||
__asm push ebp
|
||||
__asm call KeDumpStackFrames
|
||||
__asm add esp, 4
|
||||
#else
|
||||
#error Unknown compiler for inline assembler
|
||||
#endif
|
||||
MmDumpToPagingFile(BugCheckCode, BugCheckParameter1,
|
||||
BugCheckParameter2, BugCheckParameter3,
|
||||
BugCheckParameter4, NULL);
|
||||
|
||||
if (KdDebuggerEnabled)
|
||||
{
|
||||
Ke386EnableInterrupts();
|
||||
DbgBreakPointNoBugCheck();
|
||||
Ke386DisableInterrupts();
|
||||
}
|
||||
|
||||
for (;;)
|
||||
{
|
||||
Ke386HaltProcessor();
|
||||
}
|
||||
KeBugCheckWithTf(BugCheckCode, BugCheckParameter1, BugCheckParameter2,
|
||||
BugCheckParameter3, BugCheckParameter4, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue