wrap stack walks in SEH - this doesn't fix page faults tho, so something else is going to have to be done :(

svn path=/trunk/; revision=12269
This commit is contained in:
Royce Mitchell III 2004-12-21 04:05:18 +00:00
parent 93af2278c0
commit 73df8e0872
7 changed files with 90 additions and 88 deletions

View file

@ -361,6 +361,9 @@ KeResetEvent(IN PKEVENT Event);
VOID STDCALL
KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount );
ULONG STDCALL
KeRosGetStackFrames ( PULONG Frames, ULONG FrameCount );
BOOLEAN STDCALL
KeRosPrintAddress(PVOID address);

View file

@ -30,6 +30,7 @@
/* INCLUDES *****************************************************************/
#include <ntoskrnl.h>
#include <pseh.h>
#define NDEBUG
#include <internal/debug.h>
@ -630,16 +631,23 @@ VOID
KeDumpStackFrames(PULONG Frame)
{
DbgPrint("Frames: ");
while ( MmIsAddressValid(Frame) )
_SEH_TRY
{
ULONG Addr = Frame[1];
if (!KeRosPrintAddress((PVOID)Addr))
DbgPrint("<%X>", Addr);
if ( Addr == 0 || Addr == 0xDEADBEEF )
break;
Frame = (PULONG)Frame[0];
DbgPrint(" ");
while ( MmIsAddressValid(Frame) )
{
ULONG Addr = Frame[1];
if (!KeRosPrintAddress((PVOID)Addr))
DbgPrint("<%X>", Addr);
if ( Addr == 0 || Addr == 0xDEADBEEF )
break;
Frame = (PULONG)Frame[0];
DbgPrint(" ");
}
}
_SEH_HANDLE
{
}
_SEH_END;
DbgPrint("\n");
}
@ -649,29 +657,62 @@ KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount )
ULONG i=0;
DbgPrint("Frames: ");
if ( !Frame )
_SEH_TRY
{
if ( !Frame )
{
#if defined __GNUC__
__asm__("mov %%ebp, %%ebx" : "=b" (Frame) : );
#elif defined(_MSC_VER)
__asm mov [Frame], ebp
#endif
//Frame = (PULONG)Frame[0]; // step out of KeRosDumpStackFrames
}
while ( MmIsAddressValid(Frame) && i++ < FrameCount )
{
ULONG Addr = Frame[1];
if (!KeRosPrintAddress((PVOID)Addr))
DbgPrint("<%X>", Addr);
if ( Addr == 0 || Addr == 0xDEADBEEF )
break;
Frame = (PULONG)Frame[0];
DbgPrint(" ");
}
}
_SEH_HANDLE
{
}
_SEH_END;
DbgPrint("\n");
}
ULONG STDCALL
KeRosGetStackFrames ( PULONG Frames, ULONG FrameCount )
{
ULONG Count = 0;
PULONG Frame;
_SEH_TRY
{
#if defined __GNUC__
__asm__("mov %%ebp, %%ebx" : "=b" (Frame) : );
#elif defined(_MSC_VER)
__asm mov [Frame], ebp
#endif
//Frame = (PULONG)Frame[0]; // step out of KeRosDumpStackFrames
while ( Count < FrameCount )
{
Frames[Count++] = Frame[1];
Frame = (PULONG)Frame[0];
}
}
while ( MmIsAddressValid(Frame) && i++ < FrameCount )
_SEH_HANDLE
{
ULONG Addr = Frame[1];
if (!KeRosPrintAddress((PVOID)Addr))
DbgPrint("<%X>", Addr);
if ( Addr == 0 || Addr == 0xDEADBEEF )
break;
Frame = (PULONG)Frame[0];
DbgPrint(" ");
}
DbgPrint("\n");
_SEH_END;
return Count;
}
static void set_system_call_gate(unsigned int sel, unsigned int func)
static void
set_system_call_gate(unsigned int sel, unsigned int func)
{
DPRINT("sel %x %d\n",sel,sel);
KiIdt[sel].a = (((int)func)&0xffff) +

View file

@ -1,4 +1,4 @@
/* $Id: RPoolMgr.h,v 1.2 2004/12/18 21:30:17 royce Exp $
/* $Id: RPoolMgr.h,v 1.3 2004/12/21 04:05:18 royce Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -249,65 +249,26 @@ RPoolRemoveFree ( PR_POOL pool, PR_FREE Item )
#endif//DBG || KDBG
}
// this function is used to walk up a stack trace... it returns
// the pointer to the next return address above the pointer to the
// return address pointed to by Frame...
static rulong*
RNextStackFrame ( rulong* Frame )
{
if ( !Frame || !*Frame || *Frame == 0xDEADBEAF )
return NULL;
return (rulong*)( Frame[-1] ) + 1;
}
// this function returns a pointer to the address the
// caller will return to. Use RNextStackFrame() above to walk
// further up the stack.
static rulong*
RStackFrame()
{
rulong* Frame;
#if defined __GNUC__
__asm__("mov %%ebp, %%ebx" : "=b" (Frame) : );
#elif defined(_MSC_VER)
__asm mov [Frame], ebp
#endif
return RNextStackFrame ( Frame + 1 );
}
static void
RFreeFillStack ( PR_FREE free )
{
rulong* Frame = RStackFrame();
int i;
memset ( free->LastOwnerStack, 0, sizeof(free->LastOwnerStack) );
Frame = RNextStackFrame ( Frame ); // step out of RFreeInit()
Frame = RNextStackFrame ( Frame ); // step out of RFreeSplit()/RPoolReclaim()
Frame = RNextStackFrame ( Frame ); // step out of RPoolFree()
ULONG stack[R_EXTRA_STACK_UP+3]; // need to skip 3 known levels of stack trace
memset ( stack, 0xCD, sizeof(stack) );
R_GET_STACK_FRAMES ( stack, R_EXTRA_STACK_UP+3 );
for ( i = 0; i < R_EXTRA_STACK_UP; i++ )
Frame = RNextStackFrame ( Frame );
for ( i = 0; i < R_STACK && Frame; i++ )
{
free->LastOwnerStack[i] = *Frame;
Frame = RNextStackFrame ( Frame );
}
free->LastOwnerStack[i] = stack[i+3];
}
static void
RUsedFillStack ( PR_USED used )
{
rulong* Frame = RStackFrame();
int i;
memset ( used->LastOwnerStack, 0, sizeof(used->LastOwnerStack) );
Frame = RNextStackFrame ( Frame ); // step out of RUsedInit()
Frame = RNextStackFrame ( Frame ); // step out of RPoolAlloc()
ULONG stack[R_EXTRA_STACK_UP+2]; // need to skip 2 known levels of stack trace
memset ( stack, 0xCD, sizeof(stack) );
R_GET_STACK_FRAMES ( stack, R_EXTRA_STACK_UP+2 );
for ( i = 0; i < R_EXTRA_STACK_UP; i++ )
Frame = RNextStackFrame ( Frame );
for ( i = 0; i < R_STACK && Frame; i++ )
{
used->LastOwnerStack[i] = *Frame;
Frame = RNextStackFrame ( Frame );
}
used->LastOwnerStack[i] = stack[i+2];
}
static PR_FREE

View file

@ -1,4 +1,4 @@
/* $Id: ppool.c,v 1.38 2004/12/18 21:27:27 royce Exp $
/* $Id: ppool.c,v 1.39 2004/12/21 04:05:18 royce Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -32,6 +32,7 @@
#define R_PANIC() KeBugCheck(0)
#define R_DEBUG DbgPrint
#define R_EXTRA_STACK_UP 2
#define R_GET_STACK_FRAMES(ptr,cnt) KeRosGetStackFrames(ptr,cnt)
#include "RPoolMgr.h"

View file

@ -1,4 +1,4 @@
; $Id: ntoskrnl.def,v 1.204 2004/12/17 07:31:11 fireball Exp $
; $Id: ntoskrnl.def,v 1.205 2004/12/21 04:05:18 royce Exp $
;
; reactos/ntoskrnl/ntoskrnl.def
;
@ -964,6 +964,7 @@ READ_REGISTER_BUFFER_ULONG@12
READ_REGISTER_BUFFER_USHORT@12
KeRosPrintAddress@4
KeRosDumpStackFrames@8
KeRosGetStackFrames@8
RtlAbsoluteToSelfRelativeSD@12
RtlAddAccessAllowedAce@16
RtlAddAce@20

View file

@ -1,4 +1,4 @@
# $Id: makefile,v 1.107 2004/12/12 01:40:37 weiden Exp $
# $Id: makefile,v 1.108 2004/12/21 04:05:18 royce Exp $
PATH_TO_TOP = ../..
@ -14,6 +14,9 @@ TARGET_PCH = w32k.h
TARGET_DDKLIBS = freetype.a
TARGET_LIBS = \
$(SDK_PATH_LIB)/libpseh.a
TARGET_REGTESTS = yes
FREETYPE_DIR = $(PATH_TO_TOP)/lib/freetype

View file

@ -19,19 +19,25 @@
/*
* GDIOBJ.C - GDI object manipulation routines
*
* $Id: gdiobj.c,v 1.82 2004/12/19 16:53:57 weiden Exp $
* $Id: gdiobj.c,v 1.83 2004/12/21 04:05:18 royce Exp $
*/
#include <w32k.h>
#include <ddk/ntddk.h>
#define NDEBUG
#include <debug.h>
#include <pseh.h>
#ifdef __USE_W32API
/* F*(&#$ header mess!!!! */
HANDLE
STDCALL PsGetProcessId(
PEPROCESS Process
);
/* ditto */
ULONG STDCALL
KeRosGetStackFrames ( PULONG Frames, ULONG FrameCount );
#endif /* __USE_W32API */
@ -396,22 +402,8 @@ LockHandle:
InterlockedExchange(&Entry->ProcessId, CurrentProcessId);
#ifdef GDI_DEBUG
{
PULONG Frame;
int which;
#if defined __GNUC__
__asm__("mov %%ebp, %%ebx" : "=b" (Frame) : );
#elif defined(_MSC_VER)
__asm mov [Frame], ebp
#endif
for ( which = 0; which < GDI_STACK_LEVELS && Frame[1] != 0 && Frame[1] != 0xDEADBEEF; which++ )
{
GDIHandleAllocator[Index][which] = Frame[1];
Frame = ((PULONG)Frame[0]);
}
for ( ; which < GDI_STACK_LEVELS; which++ )
GDIHandleAllocator[Index][which] = 0xDEADBEEF;
}
memset ( GDIHandleAllocator[Index], 0xcd, GDI_STACK_LEVELS * sizeof(ULONG) );
KeRosGetStackFrames ( GDIHandleAllocator[Index], GDI_STACK_LEVELS );
#endif /* GDI_DEBUG */
if(W32Process != NULL)