mirror of
https://github.com/reactos/reactos.git
synced 2024-10-15 05:37:44 +00:00
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:
parent
e1399c5621
commit
2b806f43c8
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue