Jason Green a écrit :
From 1127317807ec264541e2e03e6a633cefee8f697b Mon Sep 17 00:00:00 2001 From: Jason Green <jason@jave01.(none)> Date: Thu, 17 Jan 2008 17:43:41 -0500 Subject: [PATCH] Clamp minidump memory blocks to 928KB and improve TRACEs WinDbg can't read minidumps with memory blocks larger than this. From: Eric van Beurden (ericvb@transgaming.com)
dlls/dbghelp/minidump.c | 35 +++++++++++++++++++++++++++++++++-- 1 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/dlls/dbghelp/minidump.c b/dlls/dbghelp/minidump.c index 564d824..f113728 100644 --- a/dlls/dbghelp/minidump.c +++ b/dlls/dbghelp/minidump.c @@ -32,6 +32,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
+/* windbg isn't able to open minidump files if they contain a single memory block larger
- than 928KB. If a larger block is found, it simply reports that all following streams
- could not be loaded. This is as of WinDbg version 6.7.0005.1. */
+#define MINIDUMP_MEMORY_BLOCK_MAX (928 * 1024)
struct dump_memory { ULONG base; @@ -640,8 +647,32 @@ static void dump_threads(struct dump_context* dc, } if (mdThd.Stack.Memory.DataSize && (flags_out & ThreadWriteStack)) {
add_memory_block(dc, mdThd.Stack.StartOfMemoryRange,mdThd.Stack.Memory.DataSize,
ULONG size;ULONG64 base;/* windbg only supports memory blocks up to 928KB in size. Not sure where thatspecific amount comes from, but in testing it will completely fail to loadall minidump streams that follow a memory block that is larger than 928KB.Because of this, we'll clamp all of the memory blocks that we add to thefile. */if (mdThd.Stack.Memory.DataSize > MINIDUMP_MEMORY_BLOCK_MAX){size = MINIDUMP_MEMORY_BLOCK_MAX;/* since this is the thread stack we'll want to save this block top-downinstead of just clamping the buffer size */base = mdThd.Stack.StartOfMemoryRange + (mdThd.Stack.Memory.DataSize - MINIDUMP_MEMORY_BLOCK_MAX);TRACE(" clamping the stack block starting at 0x%08llx {oldSize = %u bytes, newSize = %u bytes, newBase = 0x%08llx}\n",mdThd.Stack.StartOfMemoryRange, mdThd.Stack.Memory.DataSize, size, base);}else{size = mdThd.Stack.Memory.DataSize;base = mdThd.Stack.StartOfMemoryRange;}add_memory_block(dc, base, size, rva_base + sizeof(mdThdList.NumberOfThreads) + mdThdList.NumberOfThreads * sizeof(mdThd) + FIELD_OFFSET(MINIDUMP_THREAD, Stack.Memory.Rva));
if that's really the case (and I'm even not sure we want to support this backward compatibility), a good fix would be to add several streams each up to 928k instead of clamping A+