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

This commit is contained in:
Eric Pouech 2012-01-23 21:37:22 +01:00 committed by Alexandre Julliard
parent a672a51cbf
commit 1bd693b139
1 changed files with 29 additions and 8 deletions

View File

@ -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