mirror of
https://github.com/reactos/reactos.git
synced 2025-07-03 23:31:22 +00:00
- Memtrack enhancements
- It now warns us when it detects an entry that wasn't freed by a memtrack-enabled function - It also provides some info when it detects a double free - Removed some extra tag tracking junk svn path=/trunk/; revision=41705
This commit is contained in:
parent
90f47c629c
commit
fdf20e8c9a
3 changed files with 12 additions and 28 deletions
|
@ -38,7 +38,6 @@ VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag );
|
||||||
#define Untrack(Thing) UntrackFL(__FILE__,__LINE__,Thing)
|
#define Untrack(Thing) UntrackFL(__FILE__,__LINE__,Thing)
|
||||||
VOID TrackDumpFL( PCHAR File, ULONG Line );
|
VOID TrackDumpFL( PCHAR File, ULONG Line );
|
||||||
#define TrackDump() TrackDumpFL(__FILE__,__LINE__)
|
#define TrackDump() TrackDumpFL(__FILE__,__LINE__)
|
||||||
VOID TrackTag( ULONG Tag );
|
|
||||||
|
|
||||||
static __inline PVOID ExAllocateFromNPagedLookasideListX( PNPAGED_LOOKASIDE_LIST List, PCHAR File, ULONG Line ) {
|
static __inline PVOID ExAllocateFromNPagedLookasideListX( PNPAGED_LOOKASIDE_LIST List, PCHAR File, ULONG Line ) {
|
||||||
PVOID Out = ExAllocateFromNPagedLookasideList( List );
|
PVOID Out = ExAllocateFromNPagedLookasideList( List );
|
||||||
|
@ -62,14 +61,12 @@ static __inline VOID ExFreePoolX( PVOID Data, PCHAR File, ULONG Line ) {
|
||||||
ExFreePool( Data );
|
ExFreePool( Data );
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MEMTRACK_MAX_TAGS_TO_TRACK 64
|
|
||||||
#else
|
#else
|
||||||
#define MTMARK()
|
#define MTMARK()
|
||||||
#define Track(x,y)
|
#define Track(x,y)
|
||||||
#define TrackingInit()
|
#define TrackingInit()
|
||||||
#define TrackDump()
|
#define TrackDump()
|
||||||
#define Untrack(x)
|
#define Untrack(x)
|
||||||
#define TrackTag(x)
|
|
||||||
#define exAllocatePoolWithTag(x,y,z) ExAllocatePoolWithTag(x,y,z)
|
#define exAllocatePoolWithTag(x,y,z) ExAllocatePoolWithTag(x,y,z)
|
||||||
#define exAllocatePool(x,y) ExAllocatePool(x,y)
|
#define exAllocatePool(x,y) ExAllocatePool(x,y)
|
||||||
#define exFreePool(x) ExFreePool(x)
|
#define exFreePool(x) ExFreePool(x)
|
||||||
|
|
|
@ -725,10 +725,6 @@ DriverEntry(
|
||||||
TI_DbgPrint(MAX_TRACE, ("Called.\n"));
|
TI_DbgPrint(MAX_TRACE, ("Called.\n"));
|
||||||
|
|
||||||
TrackingInit();
|
TrackingInit();
|
||||||
TrackTag(NDIS_BUFFER_TAG);
|
|
||||||
TrackTag(NDIS_PACKET_TAG);
|
|
||||||
TrackTag(FBSD_MALLOC);
|
|
||||||
TrackTag(EXALLOC_TAG);
|
|
||||||
|
|
||||||
/* TdiInitialize() ? */
|
/* TdiInitialize() ? */
|
||||||
|
|
||||||
|
|
|
@ -8,14 +8,6 @@
|
||||||
static LIST_ENTRY AllocatedObjectsList;
|
static LIST_ENTRY AllocatedObjectsList;
|
||||||
static KSPIN_LOCK AllocatedObjectsLock;
|
static KSPIN_LOCK AllocatedObjectsLock;
|
||||||
static NPAGED_LOOKASIDE_LIST AllocatedObjectsLookasideList;
|
static NPAGED_LOOKASIDE_LIST AllocatedObjectsLookasideList;
|
||||||
ULONG TagsToShow[MEMTRACK_MAX_TAGS_TO_TRACK] = { 0 };
|
|
||||||
|
|
||||||
VOID TrackTag( ULONG Tag ) {
|
|
||||||
UINT i;
|
|
||||||
|
|
||||||
for( i = 0; TagsToShow[i]; i++ );
|
|
||||||
TagsToShow[i] = Tag;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID TrackingInit() {
|
VOID TrackingInit() {
|
||||||
TcpipInitializeSpinLock( &AllocatedObjectsLock );
|
TcpipInitializeSpinLock( &AllocatedObjectsLock );
|
||||||
|
@ -82,9 +74,8 @@ VOID TrackWithTag( ULONG Tag, PVOID Thing, PCHAR FileName, ULONG LineNo ) {
|
||||||
if( ThingInList->Thing == Thing ) {
|
if( ThingInList->Thing == Thing ) {
|
||||||
RemoveEntryList(Entry);
|
RemoveEntryList(Entry);
|
||||||
|
|
||||||
TI_DbgPrint(MAX_TRACE,("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing));
|
ShowTrackedThing( "Double Alloc (Item in list)", ThingInList, TRUE );
|
||||||
ShowTrackedThing( "Double Alloc (Item in list)", ThingInList, FALSE );
|
ShowTrackedThing( "Double Alloc (Item not in list)", TrackedThing, TRUE );
|
||||||
ShowTrackedThing( "Double Alloc (Item not in list)", TrackedThing, FALSE );
|
|
||||||
|
|
||||||
ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList,
|
ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList,
|
||||||
ThingInList );
|
ThingInList );
|
||||||
|
@ -99,14 +90,6 @@ VOID TrackWithTag( ULONG Tag, PVOID Thing, PCHAR FileName, ULONG LineNo ) {
|
||||||
TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
|
TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN ShowTag( ULONG Tag ) {
|
|
||||||
UINT i;
|
|
||||||
|
|
||||||
for( i = 0; TagsToShow[i] && TagsToShow[i] != Tag; i++ );
|
|
||||||
|
|
||||||
return TagsToShow[i] ? TRUE : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag ) {
|
VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag ) {
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
|
@ -132,13 +115,21 @@ VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag ) {
|
||||||
|
|
||||||
TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
|
TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
|
||||||
|
|
||||||
/* TrackDumpFL( File, Line ); */
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Entry = Entry->Flink;
|
Entry = Entry->Flink;
|
||||||
}
|
}
|
||||||
TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
|
TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
|
||||||
DbgPrint("UNTRACK: SPECIFIED ALREADY FREE ITEM %x\n", Thing);
|
|
||||||
|
DbgPrint("[Double Free] Thing %08x %c%c%c%c (%s:%d)\n",
|
||||||
|
Thing,
|
||||||
|
((PCHAR)&Tag)[3],
|
||||||
|
((PCHAR)&Tag)[2],
|
||||||
|
((PCHAR)&Tag)[1],
|
||||||
|
((PCHAR)&Tag)[0],
|
||||||
|
File,
|
||||||
|
Line);
|
||||||
|
|
||||||
ASSERT( FALSE );
|
ASSERT( FALSE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue