Re-enabled stabs reading in the kernel debugger.

In ke/main.c, stabs for boot time drivers that were loaded with the kernel
are linked and enabled before calling KdbInit, so that the user has them
available.

In ldr, drivers are now loaded with their symbols if available.  This applies
to userland dlls, too.

I added DEL as well as backspace to the keys that cause the cursor to back
up in kdb.

The 'addr' command in kdb now prints a correct address (with symbol
info if available).

The kernel stack trace printer in exp.c now uses kdb to print addresses if
it was enabled.

svn path=/trunk/; revision=7598
This commit is contained in:
Art Yerkes 2004-01-13 03:23:11 +00:00
parent e1399c5621
commit 2b806f43c8
5 changed files with 91 additions and 12 deletions

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: kdb.c,v 1.15 2004/01/10 21:06:38 arty Exp $ /* $Id: kdb.c,v 1.16 2004/01/13 03:23:11 arty Exp $
* *
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/dbg/kdb.c * FILE: ntoskrnl/dbg/kdb.c
@ -44,6 +44,9 @@
/* GLOBALS *******************************************************************/ /* GLOBALS *******************************************************************/
#define BS 8
#define DEL 127
int isalpha( int ); int isalpha( int );
VOID VOID
PsDumpThreads(BOOLEAN System); PsDumpThreads(BOOLEAN System);
@ -212,13 +215,13 @@ KdbGetCommand(PCH Buffer)
*Buffer = 0; *Buffer = 0;
return; return;
} }
else if (Key == '\x8') else if (Key == BS || Key == DEL)
{ {
if (Buffer > Orig) if (Buffer > Orig)
{ {
Buffer--; Buffer--;
*Buffer = 0; *Buffer = 0;
DbgPrint("%c %c", 8, 8); DbgPrint("%c %c", BS, BS);
} }
} }
else else
@ -305,6 +308,7 @@ DbgPrintBackTrace(PULONG Frame, ULONG StackBase, ULONG StackLimit)
(ULONG)Frame < StackBase) (ULONG)Frame < StackBase)
{ {
KdbPrintAddress((PVOID)Frame[1]); KdbPrintAddress((PVOID)Frame[1]);
DbgPrint("\n");
Frame = (PULONG)Frame[0]; Frame = (PULONG)Frame[0];
i++; i++;
} }

View file

@ -300,6 +300,9 @@ LdrpParseImageSymbols(PIMAGE_SYMBOL_INFO SymbolInfo)
CurrentFileNameSymbol = NULL; CurrentFileNameSymbol = NULL;
CurrentFunctionSymbol = NULL; CurrentFunctionSymbol = NULL;
CurrentLineNumberSymbol = NULL; CurrentLineNumberSymbol = NULL;
DPRINT("Starting Parse: %08x to %08x\n", StabEntry, StabsEnd);
while ((ULONG_PTR) StabEntry < (ULONG_PTR) StabsEnd) while ((ULONG_PTR) StabEntry < (ULONG_PTR) StabsEnd)
{ {
Symbol = NULL; Symbol = NULL;
@ -322,8 +325,10 @@ LdrpParseImageSymbols(PIMAGE_SYMBOL_INFO SymbolInfo)
String = (PCHAR)SymbolInfo->SymbolStringsBase + StabEntry->n_strx; String = (PCHAR)SymbolInfo->SymbolStringsBase + StabEntry->n_strx;
RtlInitAnsiString(&Symbol->Name, String); RtlInitAnsiString(&Symbol->Name, String);
#ifdef STABS_DEBUG
DPRINT("FUN found. '%s' %d @ %x\n", DPRINT("FUN found. '%s' %d @ %x\n",
Symbol->Name.Buffer, FunLineNumber, FunRelativeAddress); Symbol->Name.Buffer, FunLineNumber, FunRelativeAddress);
#endif
} }
} }
else if (StabEntry->n_type == N_SLINE) else if (StabEntry->n_type == N_SLINE)
@ -335,8 +340,10 @@ LdrpParseImageSymbols(PIMAGE_SYMBOL_INFO SymbolInfo)
Symbol->RelativeAddress = FunRelativeAddress + StabEntry->n_value; Symbol->RelativeAddress = FunRelativeAddress + StabEntry->n_value;
Symbol->LineNumber = StabEntry->n_desc; Symbol->LineNumber = StabEntry->n_desc;
#ifdef STABS_DEBUG
DPRINT("SLINE found. %d @ %x\n", DPRINT("SLINE found. %d @ %x\n",
Symbol->LineNumber, Symbol->RelativeAddress); Symbol->LineNumber, Symbol->RelativeAddress);
#endif
} }
else if (StabEntry->n_type == N_SO) else if (StabEntry->n_type == N_SO)
{ {
@ -349,8 +356,10 @@ LdrpParseImageSymbols(PIMAGE_SYMBOL_INFO SymbolInfo)
String = (PCHAR)SymbolInfo->SymbolStringsBase + StabEntry->n_strx; String = (PCHAR)SymbolInfo->SymbolStringsBase + StabEntry->n_strx;
RtlInitAnsiString(&Symbol->Name, String); RtlInitAnsiString(&Symbol->Name, String);
#ifdef STABS_DEBUG
DPRINT("SO found. '%s' @ %x\n", DPRINT("SO found. '%s' @ %x\n",
Symbol->Name.Buffer, Symbol->RelativeAddress); Symbol->Name.Buffer, Symbol->RelativeAddress);
#endif
} }
if (Symbol != NULL) if (Symbol != NULL)
@ -438,6 +447,7 @@ LdrpGetFunctionName(IN PIMAGE_SYMBOL_INFO SymbolInfo,
{ {
PSYMBOL NextSymbol; PSYMBOL NextSymbol;
ULONG_PTR NextAddress; ULONG_PTR NextAddress;
ULONG_PTR AddrFound = 0;
PSYMBOL Symbol; PSYMBOL Symbol;
Symbol = SymbolInfo->FunctionSymbols.Symbols; Symbol = SymbolInfo->FunctionSymbols.Symbols;
@ -449,12 +459,15 @@ LdrpGetFunctionName(IN PIMAGE_SYMBOL_INFO SymbolInfo,
else else
NextAddress = SymbolInfo->ImageSize; NextAddress = SymbolInfo->ImageSize;
#ifdef STABS_DEBUG
DPRINT("FUN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n", DPRINT("FUN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n",
Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress); Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress);
#endif
if ((Symbol->SymbolType == ST_FUNCTION) && if ((Symbol->SymbolType == ST_FUNCTION) &&
(RelativeAddress >= Symbol->RelativeAddress) && (RelativeAddress >= Symbol->RelativeAddress) &&
(RelativeAddress < NextAddress)) (RelativeAddress < NextAddress) &&
Symbol->RelativeAddress > AddrFound)
{ {
PCHAR ExtraInfo; PCHAR ExtraInfo;
ULONG Length; ULONG Length;
@ -470,14 +483,15 @@ LdrpGetFunctionName(IN PIMAGE_SYMBOL_INFO SymbolInfo,
strncpy(FunctionName, Symbol->Name.Buffer, Length); strncpy(FunctionName, Symbol->Name.Buffer, Length);
FunctionName[Length]=0; FunctionName[Length]=0;
return STATUS_SUCCESS; AddrFound = Symbol->RelativeAddress;
/* return STATUS_SUCCESS; */
} }
Symbol = NextSymbol; Symbol = NextSymbol;
} }
DPRINT("FUN not found\n"); DPRINT("FUN not found\n");
return STATUS_UNSUCCESSFUL; return AddrFound ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
} }
static NTSTATUS static NTSTATUS
@ -498,8 +512,10 @@ LdrpGetLineNumber(IN PIMAGE_SYMBOL_INFO SymbolInfo,
else else
NextAddress = SymbolInfo->ImageSize; NextAddress = SymbolInfo->ImageSize;
#ifdef STABS_DEBUG
DPRINT("LN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n", DPRINT("LN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n",
Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress); Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress);
#endif
if ((Symbol->SymbolType == ST_LINENUMBER) && if ((Symbol->SymbolType == ST_LINENUMBER) &&
(RelativeAddress >= Symbol->RelativeAddress) && (RelativeAddress >= Symbol->RelativeAddress) &&
@ -530,12 +546,14 @@ LdrGetAddressInformation(IN PIMAGE_SYMBOL_INFO SymbolInfo,
DPRINT("RelativeAddress %p\n", RelativeAddress); DPRINT("RelativeAddress %p\n", RelativeAddress);
#ifdef PEDANTIC_STABS
if (RelativeAddress >= SymbolInfo->ImageSize) if (RelativeAddress >= SymbolInfo->ImageSize)
{ {
DPRINT("Address is not within .text section. RelativeAddress %p Length 0x%x\n", DPRINT("Address is not within .text section. RelativeAddress %p Length 0x%x\n",
RelativeAddress, SymbolInfo->ImageSize); RelativeAddress, SymbolInfo->ImageSize);
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
#endif
if (!AreSymbolsParsed(SymbolInfo)) if (!AreSymbolsParsed(SymbolInfo))
{ {
@ -613,6 +631,8 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName,
NULL, NULL,
NULL); NULL);
DPRINT("Attempting to open symbols: %wZ\n", &SymFileName);
Status = ZwOpenFile(&FileHandle, Status = ZwOpenFile(&FileHandle,
FILE_ALL_ACCESS, FILE_ALL_ACCESS,
&ObjectAttributes, &ObjectAttributes,
@ -625,7 +645,7 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName,
return; return;
} }
CPRINT("Loading symbols from %wZ...\n", &SymFileName); DPRINT("Loading symbols from %wZ...\n", &SymFileName);
/* Get the size of the file */ /* Get the size of the file */
Status = ZwQueryInformationFile(FileHandle, Status = ZwQueryInformationFile(FileHandle,
@ -640,6 +660,8 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName,
return; return;
} }
DPRINT("Symbol file is %08x bytes\n", FileStdInfo.EndOfFile.u.LowPart);
/* Allocate nonpageable memory for symbol file */ /* Allocate nonpageable memory for symbol file */
FileBuffer = ExAllocatePool(NonPagedPool, FileBuffer = ExAllocatePool(NonPagedPool,
FileStdInfo.EndOfFile.u.LowPart); FileStdInfo.EndOfFile.u.LowPart);
@ -668,12 +690,20 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName,
ZwClose(FileHandle); ZwClose(FileHandle);
DPRINT("Symbols loaded.\n");
SymbolFileHeader = (PSYMBOLFILE_HEADER) FileBuffer; SymbolFileHeader = (PSYMBOLFILE_HEADER) FileBuffer;
SymbolInfo->FileBuffer = FileBuffer; SymbolInfo->FileBuffer = FileBuffer;
SymbolInfo->SymbolsBase = FileBuffer + SymbolFileHeader->StabsOffset; SymbolInfo->SymbolsBase = FileBuffer + SymbolFileHeader->StabsOffset;
SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength; SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength;
SymbolInfo->SymbolStringsBase = FileBuffer + SymbolFileHeader->StabstrOffset; SymbolInfo->SymbolStringsBase = FileBuffer + SymbolFileHeader->StabstrOffset;
SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength; SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength;
DPRINT("Installed stabs: %wZ (%08x-%08x,%08x)\n",
FileName,
SymbolInfo->SymbolsBase,
SymbolInfo->SymbolsLength + SymbolInfo->SymbolsBase,
SymbolInfo->SymbolStringsBase);
} }
VOID VOID
@ -811,7 +841,10 @@ VOID
KdbLoadDriver(PUNICODE_STRING Filename, PMODULE_OBJECT Module) KdbLoadDriver(PUNICODE_STRING Filename, PMODULE_OBJECT Module)
{ {
/* Load symbols for the image if available */ /* Load symbols for the image if available */
DPRINT1("Loading driver %wZ symbols (driver @ %08x)\n",
Filename, Module->Base);
LdrpLoadModuleSymbols(Filename, &Module->TextSection->SymbolInfo); LdrpLoadModuleSymbols(Filename, &Module->TextSection->SymbolInfo);
} }
VOID VOID
@ -866,6 +899,12 @@ KdbProcessSymbolFile(PVOID ModuleLoadBase, PCHAR FileName, ULONG Length)
SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength; SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength;
SymbolInfo->SymbolStringsBase = ModuleLoadBase + SymbolFileHeader->StabstrOffset; SymbolInfo->SymbolStringsBase = ModuleLoadBase + SymbolFileHeader->StabstrOffset;
SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength; SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength;
DPRINT("Installed stabs: %s@%08x-%08x (%08x-%08x,%08x)\n",
FileName,
ModuleObject->Base, ModuleObject->Length + ModuleObject->Base,
SymbolInfo->SymbolsBase,
SymbolInfo->SymbolsLength + SymbolInfo->SymbolsBase,
SymbolInfo->SymbolStringsBase);
} }
} }

View file

@ -1,4 +1,4 @@
/* $Id: kd.h,v 1.20 2003/12/23 05:05:10 arty Exp $ /* $Id: kd.h,v 1.21 2004/01/13 03:23:11 arty Exp $
* *
* kernel debugger prototypes * kernel debugger prototypes
*/ */
@ -66,6 +66,9 @@ KdGdbDebugPrint (LPSTR Message);
VOID VOID
KdDebugPrint (LPSTR Message); KdDebugPrint (LPSTR Message);
VOID
KdbCreateThreadHook(PCONTEXT Context);
KD_CONTINUE_TYPE KD_CONTINUE_TYPE
KdEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, KdEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
PCONTEXT Context, PCONTEXT Context,
@ -79,6 +82,7 @@ VOID KdPrintMda(PCH pch);
#define KDB_UNLOADDRIVER_HOOK(MODULE) #define KDB_UNLOADDRIVER_HOOK(MODULE)
#define KDB_LOADERINIT_HOOK(NTOS, HAL) #define KDB_LOADERINIT_HOOK(NTOS, HAL)
#define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH) #define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH)
#define KDB_CREATE_THREAD_HOOK(CONTEXT)
#else #else
#define KDB_DELETEPROCESS_HOOK(PROCESS) KdbFreeSymbolsProcess(PROCESS) #define KDB_DELETEPROCESS_HOOK(PROCESS) KdbFreeSymbolsProcess(PROCESS)
#define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbLoadDriver(FILENAME, MODULE) #define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbLoadDriver(FILENAME, MODULE)
@ -86,6 +90,8 @@ VOID KdPrintMda(PCH pch);
#define KDB_LOADERINIT_HOOK(NTOS, HAL) KdbLdrInit(NTOS, HAL) #define KDB_LOADERINIT_HOOK(NTOS, HAL) KdbLdrInit(NTOS, HAL)
#define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH) \ #define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH) \
KdbProcessSymbolFile(LOADBASE, FILENAME, LENGTH) KdbProcessSymbolFile(LOADBASE, FILENAME, LENGTH)
#define KDB_CREATE_THREAD_HOOK(CONTEXT) \
KdbCreateThreadHook(CONTEXT)
#endif /* KDBG */ #endif /* KDBG */
VOID VOID

View file

@ -125,6 +125,14 @@ static NTSTATUS ExceptionToNtStatus[] =
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
#ifdef KDBG
STATIC BOOLEAN
print_address(PVOID address)
{
KdbPrintAddress(address);
return TRUE;
}
#else /* KDBG */
STATIC BOOLEAN STATIC BOOLEAN
print_address(PVOID address) print_address(PVOID address)
{ {
@ -152,6 +160,7 @@ print_address(PVOID address)
} }
return(FALSE); return(FALSE);
} }
#endif /* KDBG */
ULONG ULONG
KiKernelTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2) KiKernelTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2)
@ -598,7 +607,7 @@ KeDumpStackFrames(PULONG Frame)
print_address((PVOID)Frame[1]); print_address((PVOID)Frame[1]);
Frame = (PULONG)Frame[0]; Frame = (PULONG)Frame[0];
i++; i++;
DbgPrint(" "); DbgPrint("\n");
} }
} }

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: main.c,v 1.183 2004/01/09 17:16:26 sedwards Exp $ /* $Id: main.c,v 1.184 2004/01/13 03:23:11 arty Exp $
* *
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/main.c * FILE: ntoskrnl/ke/main.c
@ -629,7 +629,28 @@ ExpInitializeExecutive(VOID)
* Enter the kernel debugger before starting up the boot drivers * Enter the kernel debugger before starting up the boot drivers
*/ */
#ifdef KDBG #ifdef KDBG
KdbEnter(); {
/* Load the symbols */
UNICODE_STRING KWideModuleName;
for (i=0; i < KeLoaderBlock.ModsCount; i++)
{
RtlCreateUnicodeStringFromAsciiz(&KWideModuleName,
(PCHAR)KeLoaderModules[i].String);
LdrInitDebug(&KeLoaderModules[i],KWideModuleName.Buffer);
if( strstr((PCHAR)KeLoaderModules[i].String,".sym") ||
strstr((PCHAR)KeLoaderModules[i].String,".SYM") ) {
KdbProcessSymbolFile((PVOID)KeLoaderModules[i].ModStart,
(PCHAR)KeLoaderModules[i].String,
KeLoaderModules[i].ModEnd -
KeLoaderModules[i].ModEnd);
}
RtlFreeUnicodeString(&KWideModuleName);
}
KdbEnter();
}
#endif /* KDBG */ #endif /* KDBG */
IoCreateDriverList(); IoCreateDriverList();