- 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:
Cameron Gutman 2009-06-30 02:30:36 +00:00
parent 90f47c629c
commit fdf20e8c9a
3 changed files with 12 additions and 28 deletions

View file

@ -38,7 +38,6 @@ VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag );
#define Untrack(Thing) UntrackFL(__FILE__,__LINE__,Thing)
VOID TrackDumpFL( PCHAR File, ULONG Line );
#define TrackDump() TrackDumpFL(__FILE__,__LINE__)
VOID TrackTag( ULONG Tag );
static __inline PVOID ExAllocateFromNPagedLookasideListX( PNPAGED_LOOKASIDE_LIST List, PCHAR File, ULONG Line ) {
PVOID Out = ExAllocateFromNPagedLookasideList( List );
@ -62,14 +61,12 @@ static __inline VOID ExFreePoolX( PVOID Data, PCHAR File, ULONG Line ) {
ExFreePool( Data );
}
#define MEMTRACK_MAX_TAGS_TO_TRACK 64
#else
#define MTMARK()
#define Track(x,y)
#define TrackingInit()
#define TrackDump()
#define Untrack(x)
#define TrackTag(x)
#define exAllocatePoolWithTag(x,y,z) ExAllocatePoolWithTag(x,y,z)
#define exAllocatePool(x,y) ExAllocatePool(x,y)
#define exFreePool(x) ExFreePool(x)

View file

@ -725,10 +725,6 @@ DriverEntry(
TI_DbgPrint(MAX_TRACE, ("Called.\n"));
TrackingInit();
TrackTag(NDIS_BUFFER_TAG);
TrackTag(NDIS_PACKET_TAG);
TrackTag(FBSD_MALLOC);
TrackTag(EXALLOC_TAG);
/* TdiInitialize() ? */

View file

@ -8,14 +8,6 @@
static LIST_ENTRY AllocatedObjectsList;
static KSPIN_LOCK AllocatedObjectsLock;
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() {
TcpipInitializeSpinLock( &AllocatedObjectsLock );
@ -82,9 +74,8 @@ VOID TrackWithTag( ULONG Tag, PVOID Thing, PCHAR FileName, ULONG LineNo ) {
if( ThingInList->Thing == Thing ) {
RemoveEntryList(Entry);
TI_DbgPrint(MAX_TRACE,("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing));
ShowTrackedThing( "Double Alloc (Item in list)", ThingInList, FALSE );
ShowTrackedThing( "Double Alloc (Item not in list)", TrackedThing, FALSE );
ShowTrackedThing( "Double Alloc (Item in list)", ThingInList, TRUE );
ShowTrackedThing( "Double Alloc (Item not in list)", TrackedThing, TRUE );
ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList,
ThingInList );
@ -99,14 +90,6 @@ VOID TrackWithTag( ULONG Tag, PVOID Thing, PCHAR FileName, ULONG LineNo ) {
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 ) {
KIRQL OldIrql;
PLIST_ENTRY Entry;
@ -132,13 +115,21 @@ VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag ) {
TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
/* TrackDumpFL( File, Line ); */
return;
}
Entry = Entry->Flink;
}
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 );
}