Lionel Debroux : ntdll: Trace arena magics ( may help debugging some heap corruptions).
Alexandre Julliard
julliard at winehq.org
Wed Nov 28 08:01:38 CST 2007
Module: wine
Branch: master
Commit: ec80b544e10bab9ab4f1a5bd6e1d82bf04976aaf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ec80b544e10bab9ab4f1a5bd6e1d82bf04976aaf
Author: Lionel Debroux <lionel_debroux at yahoo.fr>
Date: Sun Nov 25 09:56:31 2007 +0100
ntdll: Trace arena magics (may help debugging some heap corruptions).
---
dlls/ntdll/heap.c | 19 ++++++++++---------
1 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c
index fa0c1c4..0c80f83 100644
--- a/dlls/ntdll/heap.c
+++ b/dlls/ntdll/heap.c
@@ -243,15 +243,16 @@ static void HEAP_Dump( HEAP *heap )
DPRINTF( "\n\nSub-heap %p: base=%p size=%08lx committed=%08lx\n",
subheap, subheap->base, subheap->size, subheap->commitSize );
- DPRINTF( "\n Block Stat Size Id\n" );
+ DPRINTF( "\n Block Arena Stat Size Id\n" );
ptr = (char *)subheap->base + subheap->headerSize;
while (ptr < (char *)subheap->base + subheap->size)
{
if (*(DWORD *)ptr & ARENA_FLAG_FREE)
{
ARENA_FREE *pArena = (ARENA_FREE *)ptr;
- DPRINTF( "%p free %08x prev=%p next=%p\n",
- pArena, pArena->size & ARENA_SIZE_MASK,
+ DPRINTF( "%p %08x free %08x prev=%p next=%p\n",
+ pArena, pArena->magic,
+ pArena->size & ARENA_SIZE_MASK,
LIST_ENTRY( pArena->entry.prev, ARENA_FREE, entry ),
LIST_ENTRY( pArena->entry.next, ARENA_FREE, entry ) );
ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK);
@@ -261,8 +262,8 @@ static void HEAP_Dump( HEAP *heap )
else if (*(DWORD *)ptr & ARENA_FLAG_PREV_FREE)
{
ARENA_INUSE *pArena = (ARENA_INUSE *)ptr;
- DPRINTF( "%p Used %08x back=%p\n",
- pArena, pArena->size & ARENA_SIZE_MASK, *((ARENA_FREE **)pArena - 1) );
+ DPRINTF( "%p %08x Used %08x back=%p\n",
+ pArena, pArena->magic, pArena->size & ARENA_SIZE_MASK, *((ARENA_FREE **)pArena - 1) );
ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK);
arenaSize += sizeof(ARENA_INUSE);
usedSize += pArena->size & ARENA_SIZE_MASK;
@@ -270,7 +271,7 @@ static void HEAP_Dump( HEAP *heap )
else
{
ARENA_INUSE *pArena = (ARENA_INUSE *)ptr;
- DPRINTF( "%p used %08x\n", pArena, pArena->size & ARENA_SIZE_MASK );
+ DPRINTF( "%p %08x used %08x\n", pArena, pArena->magic, pArena->size & ARENA_SIZE_MASK );
ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK);
arenaSize += sizeof(ARENA_INUSE);
usedSize += pArena->size & ARENA_SIZE_MASK;
@@ -813,7 +814,7 @@ static BOOL HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena )
/* Check magic number */
if (pArena->magic != ARENA_FREE_MAGIC)
{
- ERR("Heap %p: invalid free arena magic for %p\n", subheap->heap, pArena );
+ ERR("Heap %p: invalid free arena magic %08x for %p\n", subheap->heap, pArena->magic, pArena );
return FALSE;
}
/* Check size flags */
@@ -916,11 +917,11 @@ static BOOL HEAP_ValidateInUseArena( const SUBHEAP *subheap, const ARENA_INUSE *
if (pArena->magic != ARENA_INUSE_MAGIC)
{
if (quiet == NOISY) {
- ERR("Heap %p: invalid in-use arena magic for %p\n", subheap->heap, pArena );
+ ERR("Heap %p: invalid in-use arena magic %08x for %p\n", subheap->heap, pArena->magic, pArena );
if (TRACE_ON(heap))
HEAP_Dump( subheap->heap );
} else if (WARN_ON(heap)) {
- WARN("Heap %p: invalid in-use arena magic for %p\n", subheap->heap, pArena );
+ WARN("Heap %p: invalid in-use arena magic %08x for %p\n", subheap->heap, pArena->magic, pArena );
if (TRACE_ON(heap))
HEAP_Dump( subheap->heap );
}
More information about the wine-cvs
mailing list