From 2b806f43c83624dcbbb1fa0ee49a0a008e3cc369 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Tue, 13 Jan 2004 03:23:11 +0000 Subject: [PATCH] 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 --- reactos/ntoskrnl/dbg/kdb.c | 10 ++++-- reactos/ntoskrnl/dbg/kdb_stabs.c | 49 +++++++++++++++++++++++--- reactos/ntoskrnl/include/internal/kd.h | 8 ++++- reactos/ntoskrnl/ke/i386/exp.c | 11 +++++- reactos/ntoskrnl/ke/main.c | 25 +++++++++++-- 5 files changed, 91 insertions(+), 12 deletions(-) diff --git a/reactos/ntoskrnl/dbg/kdb.c b/reactos/ntoskrnl/dbg/kdb.c index a0b3329fd4a..ab90f07046e 100644 --- a/reactos/ntoskrnl/dbg/kdb.c +++ b/reactos/ntoskrnl/dbg/kdb.c @@ -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: 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 * FILE: ntoskrnl/dbg/kdb.c @@ -44,6 +44,9 @@ /* GLOBALS *******************************************************************/ +#define BS 8 +#define DEL 127 + int isalpha( int ); VOID PsDumpThreads(BOOLEAN System); @@ -212,13 +215,13 @@ KdbGetCommand(PCH Buffer) *Buffer = 0; return; } - else if (Key == '\x8') + else if (Key == BS || Key == DEL) { if (Buffer > Orig) { Buffer--; *Buffer = 0; - DbgPrint("%c %c", 8, 8); + DbgPrint("%c %c", BS, BS); } } else @@ -305,6 +308,7 @@ DbgPrintBackTrace(PULONG Frame, ULONG StackBase, ULONG StackLimit) (ULONG)Frame < StackBase) { KdbPrintAddress((PVOID)Frame[1]); + DbgPrint("\n"); Frame = (PULONG)Frame[0]; i++; } diff --git a/reactos/ntoskrnl/dbg/kdb_stabs.c b/reactos/ntoskrnl/dbg/kdb_stabs.c index 78cdf3fff6f..c3506936fea 100644 --- a/reactos/ntoskrnl/dbg/kdb_stabs.c +++ b/reactos/ntoskrnl/dbg/kdb_stabs.c @@ -300,6 +300,9 @@ LdrpParseImageSymbols(PIMAGE_SYMBOL_INFO SymbolInfo) CurrentFileNameSymbol = NULL; CurrentFunctionSymbol = NULL; CurrentLineNumberSymbol = NULL; + + DPRINT("Starting Parse: %08x to %08x\n", StabEntry, StabsEnd); + while ((ULONG_PTR) StabEntry < (ULONG_PTR) StabsEnd) { Symbol = NULL; @@ -322,8 +325,10 @@ LdrpParseImageSymbols(PIMAGE_SYMBOL_INFO SymbolInfo) String = (PCHAR)SymbolInfo->SymbolStringsBase + StabEntry->n_strx; RtlInitAnsiString(&Symbol->Name, String); +#ifdef STABS_DEBUG DPRINT("FUN found. '%s' %d @ %x\n", Symbol->Name.Buffer, FunLineNumber, FunRelativeAddress); +#endif } } else if (StabEntry->n_type == N_SLINE) @@ -335,8 +340,10 @@ LdrpParseImageSymbols(PIMAGE_SYMBOL_INFO SymbolInfo) Symbol->RelativeAddress = FunRelativeAddress + StabEntry->n_value; Symbol->LineNumber = StabEntry->n_desc; +#ifdef STABS_DEBUG DPRINT("SLINE found. %d @ %x\n", Symbol->LineNumber, Symbol->RelativeAddress); +#endif } else if (StabEntry->n_type == N_SO) { @@ -349,8 +356,10 @@ LdrpParseImageSymbols(PIMAGE_SYMBOL_INFO SymbolInfo) String = (PCHAR)SymbolInfo->SymbolStringsBase + StabEntry->n_strx; RtlInitAnsiString(&Symbol->Name, String); +#ifdef STABS_DEBUG DPRINT("SO found. '%s' @ %x\n", Symbol->Name.Buffer, Symbol->RelativeAddress); +#endif } if (Symbol != NULL) @@ -438,6 +447,7 @@ LdrpGetFunctionName(IN PIMAGE_SYMBOL_INFO SymbolInfo, { PSYMBOL NextSymbol; ULONG_PTR NextAddress; + ULONG_PTR AddrFound = 0; PSYMBOL Symbol; Symbol = SymbolInfo->FunctionSymbols.Symbols; @@ -449,12 +459,15 @@ LdrpGetFunctionName(IN PIMAGE_SYMBOL_INFO SymbolInfo, else NextAddress = SymbolInfo->ImageSize; +#ifdef STABS_DEBUG DPRINT("FUN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n", Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress); +#endif if ((Symbol->SymbolType == ST_FUNCTION) && - (RelativeAddress >= Symbol->RelativeAddress) && - (RelativeAddress < NextAddress)) + (RelativeAddress >= Symbol->RelativeAddress) && + (RelativeAddress < NextAddress) && + Symbol->RelativeAddress > AddrFound) { PCHAR ExtraInfo; ULONG Length; @@ -470,14 +483,15 @@ LdrpGetFunctionName(IN PIMAGE_SYMBOL_INFO SymbolInfo, strncpy(FunctionName, Symbol->Name.Buffer, Length); FunctionName[Length]=0; - return STATUS_SUCCESS; + AddrFound = Symbol->RelativeAddress; + /* return STATUS_SUCCESS; */ } Symbol = NextSymbol; } DPRINT("FUN not found\n"); - return STATUS_UNSUCCESSFUL; + return AddrFound ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; } static NTSTATUS @@ -498,8 +512,10 @@ LdrpGetLineNumber(IN PIMAGE_SYMBOL_INFO SymbolInfo, else NextAddress = SymbolInfo->ImageSize; +#ifdef STABS_DEBUG DPRINT("LN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n", Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress); +#endif if ((Symbol->SymbolType == ST_LINENUMBER) && (RelativeAddress >= Symbol->RelativeAddress) && @@ -530,12 +546,14 @@ LdrGetAddressInformation(IN PIMAGE_SYMBOL_INFO SymbolInfo, DPRINT("RelativeAddress %p\n", RelativeAddress); +#ifdef PEDANTIC_STABS if (RelativeAddress >= SymbolInfo->ImageSize) { DPRINT("Address is not within .text section. RelativeAddress %p Length 0x%x\n", RelativeAddress, SymbolInfo->ImageSize); return STATUS_UNSUCCESSFUL; } +#endif if (!AreSymbolsParsed(SymbolInfo)) { @@ -613,6 +631,8 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName, NULL, NULL); + DPRINT("Attempting to open symbols: %wZ\n", &SymFileName); + Status = ZwOpenFile(&FileHandle, FILE_ALL_ACCESS, &ObjectAttributes, @@ -625,7 +645,7 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName, return; } - CPRINT("Loading symbols from %wZ...\n", &SymFileName); + DPRINT("Loading symbols from %wZ...\n", &SymFileName); /* Get the size of the file */ Status = ZwQueryInformationFile(FileHandle, @@ -640,6 +660,8 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName, return; } + DPRINT("Symbol file is %08x bytes\n", FileStdInfo.EndOfFile.u.LowPart); + /* Allocate nonpageable memory for symbol file */ FileBuffer = ExAllocatePool(NonPagedPool, FileStdInfo.EndOfFile.u.LowPart); @@ -668,12 +690,20 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName, ZwClose(FileHandle); + DPRINT("Symbols loaded.\n"); + SymbolFileHeader = (PSYMBOLFILE_HEADER) FileBuffer; SymbolInfo->FileBuffer = FileBuffer; SymbolInfo->SymbolsBase = FileBuffer + SymbolFileHeader->StabsOffset; SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength; SymbolInfo->SymbolStringsBase = FileBuffer + SymbolFileHeader->StabstrOffset; SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength; + + DPRINT("Installed stabs: %wZ (%08x-%08x,%08x)\n", + FileName, + SymbolInfo->SymbolsBase, + SymbolInfo->SymbolsLength + SymbolInfo->SymbolsBase, + SymbolInfo->SymbolStringsBase); } VOID @@ -811,7 +841,10 @@ VOID KdbLoadDriver(PUNICODE_STRING Filename, PMODULE_OBJECT Module) { /* Load symbols for the image if available */ + DPRINT1("Loading driver %wZ symbols (driver @ %08x)\n", + Filename, Module->Base); LdrpLoadModuleSymbols(Filename, &Module->TextSection->SymbolInfo); + } VOID @@ -866,6 +899,12 @@ KdbProcessSymbolFile(PVOID ModuleLoadBase, PCHAR FileName, ULONG Length) SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength; SymbolInfo->SymbolStringsBase = ModuleLoadBase + SymbolFileHeader->StabstrOffset; 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); } } diff --git a/reactos/ntoskrnl/include/internal/kd.h b/reactos/ntoskrnl/include/internal/kd.h index 927fad2e62d..647f95e91ca 100644 --- a/reactos/ntoskrnl/include/internal/kd.h +++ b/reactos/ntoskrnl/include/internal/kd.h @@ -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 */ @@ -66,6 +66,9 @@ KdGdbDebugPrint (LPSTR Message); VOID KdDebugPrint (LPSTR Message); +VOID +KdbCreateThreadHook(PCONTEXT Context); + KD_CONTINUE_TYPE KdEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, PCONTEXT Context, @@ -79,6 +82,7 @@ VOID KdPrintMda(PCH pch); #define KDB_UNLOADDRIVER_HOOK(MODULE) #define KDB_LOADERINIT_HOOK(NTOS, HAL) #define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH) +#define KDB_CREATE_THREAD_HOOK(CONTEXT) #else #define KDB_DELETEPROCESS_HOOK(PROCESS) KdbFreeSymbolsProcess(PROCESS) #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_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH) \ KdbProcessSymbolFile(LOADBASE, FILENAME, LENGTH) +#define KDB_CREATE_THREAD_HOOK(CONTEXT) \ + KdbCreateThreadHook(CONTEXT) #endif /* KDBG */ VOID diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index ddb8fb9c67f..2afd69b345f 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -125,6 +125,14 @@ static NTSTATUS ExceptionToNtStatus[] = /* FUNCTIONS ****************************************************************/ +#ifdef KDBG +STATIC BOOLEAN +print_address(PVOID address) +{ + KdbPrintAddress(address); + return TRUE; +} +#else /* KDBG */ STATIC BOOLEAN print_address(PVOID address) { @@ -152,6 +160,7 @@ print_address(PVOID address) } return(FALSE); } +#endif /* KDBG */ ULONG KiKernelTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2) @@ -598,7 +607,7 @@ KeDumpStackFrames(PULONG Frame) print_address((PVOID)Frame[1]); Frame = (PULONG)Frame[0]; i++; - DbgPrint(" "); + DbgPrint("\n"); } } diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index fe67b190f07..6065b379d33 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -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: 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 * FILE: ntoskrnl/ke/main.c @@ -629,7 +629,28 @@ ExpInitializeExecutive(VOID) * Enter the kernel debugger before starting up the boot drivers */ #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 */ IoCreateDriverList();