From 1127317807ec264541e2e03e6a633cefee8f697b Mon Sep 17 00:00:00 2001 From: Jason Green 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 that + specific amount comes from, but in testing it will completely fail to load + all 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 the + file. */ + 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-down + instead 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)); -- 1.4.4.2