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();