Skip to content
IL instrumenter to help detect "IDisposable leaks" in .NET programs
C#
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
EyeDisposable.Core
EyeDisposable.Logger
EyeDisposable Changed 755 to 644 May 23, 2011
Tests
lib
test-programs
.gitignore Changed 755 to 644 May 23, 2011
.gitmodules
EyeDisposable.nunit
EyeDisposable.sln
EyeDisposable.snk
LICENSE
README.markdown

README.markdown

EyeDisposable

What?

If you have used IDisposable, you will know the problem. It's very easy to "leak" them by forgetting to call Dispose() on them. Yes, most objects' finalizers will eventually call Dispose(), but it's a bad practice to rely on finalizer being run at all. It's cleaner and neater to Dispose() of them at an appropriate time.

Usage

1. Instrument your entry assembly and other dependent assemblies.

> EyeDisposable.exe C:\Projects\Foo\Foo.exe

Instrumenting type `<Module>`...
Instrumenting type `Foo`...
Instrumenting type `Program`...
- System.Void Foo.Program::Main(System.String[]): 1 newobjs; 0 disposes
Instrumenting entry point...

> EyeDisposable.exe C:\Projects\Foo\Bar.dll
...

2. Run

> cd C:\Projects\Foo
> Foo.exe

3. Profit

> type Foo.exe.DisposeLeaks.log
====
Disposer check
1 leaks detected!
====
Disposable object leaked!
Hash code: 30015890
Type: Foo.Foo
Created at:
> [Foo.Program] Void Main(System.String[])
> [Foo.Program] Void EyeDisposable_NewMain(System.String[])

How does it work?

EyeDisposable uses Mono.Cecil to instrument assemblies. newobj and Dispose() calls are tallied and checked at the end of the program.

Cloning

You need to update the Cecil submodule after cloning:

> git clone git://github.com/kizzx2/EyeDisposable.git
> cd EyeDisposable
> git submodule init
> git submodule update

Limitations

  • IDisposable value types are not supported.
You can’t perform that action at this time.