Eric Pouech : winedbg: Enhance algorithm to look up for memory data inside a minidump.

Alexandre Julliard julliard at winehq.org
Tue Jan 24 14:25:31 CST 2012


Module: wine
Branch: master
Commit: 1bd693b139e539a2c606d5eca914379dfc2f1cd8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1bd693b139e539a2c606d5eca914379dfc2f1cd8

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Mon Jan 23 21:37:22 2012 +0100

winedbg: Enhance algorithm to look up for memory data inside a minidump.

---

 programs/winedbg/tgt_minidump.c |   39 ++++++++++++++++++++++++++++++---------
 1 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/programs/winedbg/tgt_minidump.c b/programs/winedbg/tgt_minidump.c
index afa41d8..c346070 100644
--- a/programs/winedbg/tgt_minidump.c
+++ b/programs/winedbg/tgt_minidump.c
@@ -103,22 +103,43 @@ static BOOL tgt_process_minidump_read(HANDLE hProcess, const void* addr,
     {
         MINIDUMP_MEMORY_LIST*   mml = stream;
         MINIDUMP_MEMORY_DESCRIPTOR* mmd = &mml->MemoryRanges[0];
-        int                     i;
-
+        int                     i, found = -1;
+        SIZE_T                  ilen, prev_len = 0;
+
+        /* There's no reason that memory ranges inside a minidump do not overlap.
+         * So be smart when looking for a given memory range (either grab a
+         * range that covers the whole requested area, or if none, the range that
+         * has the largest overlap with requested area)
+         */
         for (i = 0; i < mml->NumberOfMemoryRanges; i++, mmd++)
         {
             if (get_addr64(mmd->StartOfMemoryRange) <= (DWORD_PTR)addr &&
                 (DWORD_PTR)addr < get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize)
             {
-                len = min(len,
-                          get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize - (DWORD_PTR)addr);
-                memcpy(buffer,
-                       (char*)private_data(dbg_curr_process)->mapping + mmd->Memory.Rva + (DWORD_PTR)addr - get_addr64(mmd->StartOfMemoryRange),
-                       len);
-                if (rlen) *rlen = len;
-                return TRUE;
+                ilen = min(len,
+                           get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize - (DWORD_PTR)addr);
+                if (ilen == len) /* whole range is matched */
+                {
+                    found = i;
+                    prev_len = ilen;
+                    break;
+                }
+                if (found == -1 || ilen > prev_len) /* partial match, keep largest one */
+                {
+                    found = i;
+                    prev_len = ilen;
+                }
             }
         }
+        if (found != -1)
+        {
+            mmd = &mml->MemoryRanges[found];
+            memcpy(buffer,
+                   (char*)private_data(dbg_curr_process)->mapping + mmd->Memory.Rva + (DWORD_PTR)addr - get_addr64(mmd->StartOfMemoryRange),
+                   prev_len);
+            if (rlen) *rlen = prev_len;
+            return TRUE;
+        }
     }
     /* FIXME: this is a dirty hack to let the last frame in a bt to work
      * However, we need to check who's to blame, this code or the current 




More information about the wine-cvs mailing list