winedbg: Enhance algorithm to look up for memory data inside a minidump.
This commit is contained in:
parent
a672a51cbf
commit
1bd693b139
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue