[NTOS:KDBG] Improve x64 stack trace printing

This commit is contained in:
Timo Kreuzer 2022-07-23 17:07:37 +02:00
parent 090ccb3d8e
commit 74014e74c0

View file

@ -1211,44 +1211,30 @@ KdbpCmdBackTrace(
PCHAR Argv[]) PCHAR Argv[])
{ {
CONTEXT Context = *KdbCurrentTrapFrame; CONTEXT Context = *KdbCurrentTrapFrame;
ULONG64 CurrentRsp, CurrentRip;
KdbpPrint("Rip:\n");
if (!KdbSymPrintAddress((PVOID)KeGetContextPc(&Context), &Context))
KdbpPrint("<%p>\n", KeGetContextPc(&Context));
else
KdbpPrint("\n");
/* Walk through the frames */ /* Walk through the frames */
KdbpPrint("Frames:\n"); KdbpPrint("Frames:\n");
for (;;) do
{ {
CurrentRip = Context.Rip; BOOLEAN GotNextFrame;
CurrentRsp = Context.Rsp;
BOOLEAN GotNextFrame = GetNextFrame(&Context); KdbpPrint("[%p] ", (PVOID)Context.Rsp);
KdbpPrint("[%p] ", (PVOID)CurrentRsp); /* Print the location after the call instruction */
Context.Rsp = Context.Rsp; if (!KdbSymPrintAddress((PVOID)Context.Rip, &Context))
/* Print the location afrer the call instruction */
if (!KdbSymPrintAddress((PVOID)CurrentRip, &Context))
KdbpPrint("<%p>", (PVOID)Context.Rip); KdbpPrint("<%p>", (PVOID)Context.Rip);
KdbpPrint("\n");
KdbpPrint(" (stack: 0x%Ix)\n", Context.Rsp - CurrentRsp);
if (KdbOutputAborted) if (KdbOutputAborted)
break; break;
if (Context.Rsp == 0) GotNextFrame = GetNextFrame(&Context);
break;
if (!GotNextFrame) if (!GotNextFrame)
{ {
KdbpPrint("Couldn't access memory at 0x%p!\n", (PVOID)Context.Rsp); KdbpPrint("Couldn't get next frame\n");
break; break;
} }
} } while ((Context.Rip != 0) && (Context.Rsp != 0));
return TRUE; return TRUE;
} }