[dbghelp 10/10] Clamp minidump memory blocks to 928KB
Eric Pouech
eric.pouech at orange.fr
Fri Jan 18 14:22:53 CST 2008
Jason Green a écrit :
> ------------------------------------------------------------------------
>
> From 1127317807ec264541e2e03e6a633cefee8f697b Mon Sep 17 00:00:00 2001
> From: Jason Green <jason at 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 at 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));
>
> ------------------------------------------------------------------------
>
>
>
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+
--
Eric Pouech
"The problem with designing something completely foolproof is to underestimate the ingenuity of a complete idiot." (Douglas Adams)
More information about the wine-patches
mailing list