- 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) #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)

View file

@ -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() ? */

View file

@ -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 );
} }