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
* 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++;
}

View file

@ -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);
}
}

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
*/
@ -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

View file

@ -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");
}
}

View file

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