[DRWTSN32] Improve stack dumping 962/head
authorMark Jansen <mark.jansen@reactos.org>
Sun, 21 Oct 2018 12:46:44 +0000 (14:46 +0200)
committerMark Jansen <mark.jansen@reactos.org>
Sun, 28 Oct 2018 12:00:44 +0000 (13:00 +0100)
base/applications/drwtsn32/stacktrace.cpp

index 5c93f78..0dbd5d0 100644 (file)
@@ -2,12 +2,14 @@
  * PROJECT:     Dr. Watson crash reporter
  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
  * PURPOSE:     Print a stacktrace
- * COPYRIGHT:   Copyright 2017 Mark Jansen (mark.jansen@reactos.org)
+ * COPYRIGHT:   Copyright 2017,2018 Mark Jansen (mark.jansen@reactos.org)
  */
 
 #include "precomp.h"
 #include <dbghelp.h>
 
+#define STACK_MAX_RECURSION_DEPTH   50
+
 
 void BeginStackBacktrace(DumpData& data)
 {
@@ -59,23 +61,28 @@ void PrintStackBacktrace(FILE* output, DumpData& data, ThreadData& thread)
     char buf[sizeof(SYMBOL_INFO) + STACKWALK_MAX_NAMELEN] = {0};
     SYMBOL_INFO* sym = (SYMBOL_INFO *)buf;
     IMAGEHLP_MODULE64 Module = { 0 };
+    LONG RecursionDepth = 0;
     sym->SizeOfStruct = sizeof(sym);
 
-    /* FIXME: Disasm function! */
+    /* FIXME: dump x bytes at EIP here + disasm it! */
 
     xfprintf(output, NEWLINE "*----> Stack Back Trace <----*" NEWLINE NEWLINE);
     bool first = true;
-    ULONG_PTR LastFrame = StackFrame.AddrFrame.Offset - 8;
-    while(StackWalk64(MachineType, data.ProcessHandle, thread.Handle, &StackFrame, &thread.Context,
-                         NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL))
+    while (StackWalk64(MachineType, data.ProcessHandle, thread.Handle, &StackFrame, &thread.Context,
+                       NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL))
     {
-        if (!StackFrame.AddrPC.Offset)
-            break;
-
-        if (LastFrame >= StackFrame.AddrFrame.Offset)
-            break;
-
-        LastFrame = StackFrame.AddrFrame.Offset;
+        if (StackFrame.AddrPC.Offset == StackFrame.AddrReturn.Offset)
+        {
+            if (RecursionDepth++ > STACK_MAX_RECURSION_DEPTH)
+            {
+                xfprintf(output, "- Aborting stackwalk -" NEWLINE);
+                break;
+            }
+        }
+        else
+        {
+            RecursionDepth = 0;
+        }
 
         if (first)
         {
@@ -85,7 +92,7 @@ void PrintStackBacktrace(FILE* output, DumpData& data, ThreadData& thread)
 
         Module.SizeOfStruct = sizeof(Module);
         DWORD64 ModBase = SymGetModuleBase64(data.ProcessHandle, StackFrame.AddrPC.Offset);
-        if (!SymGetModuleInfo64(data.ProcessHandle, ModBase, &Module))
+        if (!ModBase || !SymGetModuleInfo64(data.ProcessHandle, ModBase, &Module))
             strcpy(Module.ModuleName, "<nomod>");
 
         memset(sym, '\0', sizeof(*sym) + STACKWALK_MAX_NAMELEN);
@@ -93,7 +100,7 @@ void PrintStackBacktrace(FILE* output, DumpData& data, ThreadData& thread)
         sym->MaxNameLen = STACKWALK_MAX_NAMELEN;
         DWORD64 displacement;
 
-        if (!SymFromAddr(data.ProcessHandle, StackFrame.AddrPC.Offset, &displacement, sym))
+        if (!StackFrame.AddrPC.Offset || !SymFromAddr(data.ProcessHandle, StackFrame.AddrPC.Offset, &displacement, sym))
             strcpy(sym->Name, "<nosymbols>");
 
         xfprintf(output, "%p %p %p %p %p %p %s!%s" NEWLINE,