[PATCH 3/9] winedbg: enhance accuracy of print_address().

Eric Pouech eric.pouech at gmail.com
Fri Nov 26 10:30:22 CST 2021


No longer print the form 'func+disp' when the address is after the
end of said function. Print instead 'module+disp'

Signed-off-by: Eric Pouech <eric.pouech at gmail.com>

---
 programs/winedbg/memory.c |   32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/programs/winedbg/memory.c b/programs/winedbg/memory.c
index 2490b7cf7e2..4128606c9a9 100644
--- a/programs/winedbg/memory.c
+++ b/programs/winedbg/memory.c
@@ -583,28 +583,42 @@ void print_address(const ADDRESS64* addr, BOOLEAN with_line)
 {
     char                buffer[sizeof(SYMBOL_INFO) + 256];
     SYMBOL_INFO*        si = (SYMBOL_INFO*)buffer;
-    void*               lin = memory_to_linear_addr(addr);
+    DWORD_PTR           lin = (DWORD_PTR)memory_to_linear_addr(addr);
     DWORD64             disp64;
     DWORD               disp;
+    IMAGEHLP_MODULE     im;
 
     print_bare_address(addr);
 
     si->SizeOfStruct = sizeof(*si);
     si->MaxNameLen   = 256;
-    if (!SymFromAddr(dbg_curr_process->handle, (DWORD_PTR)lin, &disp64, si)) return;
-    dbg_printf(" %s", si->Name);
-    if (disp64) dbg_printf("+0x%I64x", disp64);
+    im.SizeOfStruct  = 0;
+    if (SymFromAddr(dbg_curr_process->handle, lin, &disp64, si) && disp64 < si->Size)
+    {
+        dbg_printf(" %s", si->Name);
+        if (disp64) dbg_printf("+0x%I64x", disp64);
+    }
+    else
+    {
+        im.SizeOfStruct = sizeof(im);
+        if (!SymGetModuleInfo(dbg_curr_process->handle, lin, &im)) return;
+        dbg_printf(" %s", im.ModuleName);
+        if (lin > im.BaseOfImage)
+            dbg_printf("+0x%Ix", lin - im.BaseOfImage);
+    }
     if (with_line)
     {
         IMAGEHLP_LINE64             il;
-        IMAGEHLP_MODULE             im;
 
         il.SizeOfStruct = sizeof(il);
-        if (SymGetLineFromAddr64(dbg_curr_process->handle, (DWORD_PTR)lin, &disp, &il))
+        if (SymGetLineFromAddr64(dbg_curr_process->handle, lin, &disp, &il))
             dbg_printf(" [%s:%u]", il.FileName, il.LineNumber);
-        im.SizeOfStruct = sizeof(im);
-        if (SymGetModuleInfo(dbg_curr_process->handle, (DWORD_PTR)lin, &im))
-            dbg_printf(" in %s", im.ModuleName);
+        if (im.SizeOfStruct == 0) /* don't display again module if address is in module+disp form */
+        {
+            im.SizeOfStruct = sizeof(im);
+            if (SymGetModuleInfo(dbg_curr_process->handle, lin, &im))
+                dbg_printf(" in %s", im.ModuleName);
+        }
     }
 }
 




More information about the wine-devel mailing list