- Lightweight and simple memory C++11 leak finder with no dependencies
- Easy to integrate. No source modification is required.
- Clean. Macroless and callstack based. No new/delete macro hacks.
- Lazy. Should work out of the box. Plenty configuration options are provided anyways.
- Tiny. One header and one source file.
- Cross-platform. OS dependencies only. No third party dependencies.
- MIT licensed.
kTraceyAlloc(size)defaults tostd::malloc(size)if not overriden.- All allocations merge to this symbol.
kTraceyFree(ptr)defaults tostd::free(ptr)if not overriden.- All deallocations merge to this symbol.
kTraceyPrint(str)defaults tofprintf(stderr,"%s",str)if not overriden.- All warning and reports merge to this symbol.
kTraceyAssert(expr)defaults toassert(expr)if not overriden.- All out-of-memory runtime asserts merge to this symbol.
kTraceyBadAlloc()defaults tostd::bad_alloc()if not overriden.- All out-of-memory runtime exceptions merge to this sysmbol.
kTraceyAllocMultiplierdefaults to1.0if not overriden (should be >= 1.0).- Tracey uses this value to increase memory requirements, and to simulate and to debug worse memory conditions.
kTraceyReportWildPointersdefaults to1if not overriden (should be 0 or 1).- When enabled, Tracey warns about deallocations on pointers that have been not allocated by Tracey (wild pointers).
kTraceyReportNullPointersdefaults to0if not overriden (should be 0 or 1).- When enabled, Tracey warns about deallocations on null pointers.
kTraceyEnabledOnStartdefaults to1if not overriden (should be 0 or 1).- When enabled, Tracey starts before application is running.
kTraceyReportOnExitdefaults to1if not overriden (should be 0 or 1).- When enabled, Tracey shows a report automatically on application exit.
kTraceyDefineMemoryOperatorsdefaults to1if not overriden (should be 0 or 1).- When enabled, Tracey implements all new([])/delete([]) operators.
- When disabled, user must provide de/allocation operators thru runtime API (see below).
tracey::watch()tells Tracey to watch a memory address.tracey::forget()tells Tracey to forget about a memory address.tracey::enable()tells Tracey to enable/disable whole watching system.tracey::disable()tells Tracey to disable whole watching system.tracey::is_enabled()returns Tracey's working status.tracey::invalidate()tells Tracey to forget whole execution.tracey::report()tells Tracey to show current report.tracey::version()tells Tracey to return current version.
// tracey is callstack based. no dirty new/delete macro tricks.
// tracey is a static library. requires no source modification. just link it.
void *make_leaks()
{
return new int [400];
}
int main( int argc, const char **argv )
{
int *make_leak = new int();
make_leaks();
return 0;
}
D:\prj\tracey>cl sample.cc tracey.cpp /MDd /Zi && rem g++ sample.cc tracey.cpp -g -rdynamic -std=c++0x
D:\prj\tracey>sample
<tracey/tracey.cpp> says: Beginning of report. Error, 2 leaks found; 1604 bytes wasted ('lame' score)
1) Leak 4 bytes [0033F1E8] backtrace 1/2 (50%)
main (d:\prj\moons\tracey\sample.cc, line 11)
__tmainCRTStartup (f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c, line 536)
mainCRTStartup (f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c, line 377)
BaseThreadInitThunk
RtlInitializeExceptionChain
RtlInitializeExceptionChain
2) Leak 1600 bytes [0035D8E8] backtrace 2/2 (100%)
make_leaks (d:\prj\moons\tracey\sample.cc, line 6)
main (d:\prj\moons\tracey\sample.cc, line 14)
__tmainCRTStartup (f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c, line 536)
mainCRTStartup (f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c, line 377)
BaseThreadInitThunk
RtlInitializeExceptionChain
RtlInitializeExceptionChain
<tracey/tracey.cpp> says: End of report. Error, 2 leaks found; 1604 bytes wasted ('lame' score)
D:\prj\tracey>