Automated way of checking if all instances of a type have been properly disposed of [modified]
-
No, this isn't a programming question, so please read properly before lynch-voting :) And if you decide to lynch vote this after all, an explanation would be appreciated. I discovered today that a core component of my app has a lot of instances of a custom type,
HDElement
*, that are not disposed of. This is causing a HUGE memory leak and it has fallen on my shoulders to remove this leak. Does anybody know of a way to see if all instances haveDispose()
called on them? The thought of creating a custom FxCop rule did occur to me, but I've never done that before, and don't know if this is even possible. At the moment, I am going through every source file and addingtry...finally
blocks that callDispose()
on allHDElement
instances :(( I was wondering if there's a better way of doing this? I am using VS 2008 but am targeting .NET 2.0. *HDElement
is part of a library provided by another team in another continent in the same company, and holds lots of unmanaged resources that the GC cannot take care of.Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
modified on Monday, January 19, 2009 11:55 AM to include framework version.
No, I can't see it. How is this anything other than a programming question?
Regards, Rob Philpott.
-
No, I can't see it. How is this anything other than a programming question?
Regards, Rob Philpott.
It's borderline. I gave him the benefit of the doubt, that he was looking for some sort of plugin library :)
xacc.ide - now with TabsToSpaces support
IronScheme - 1.0 beta 1 - out now!
((lambda (x) `((lambda (x) ,x) ',x)) '`((lambda (x) ,x) ',x)) -
No, this isn't a programming question, so please read properly before lynch-voting :) And if you decide to lynch vote this after all, an explanation would be appreciated. I discovered today that a core component of my app has a lot of instances of a custom type,
HDElement
*, that are not disposed of. This is causing a HUGE memory leak and it has fallen on my shoulders to remove this leak. Does anybody know of a way to see if all instances haveDispose()
called on them? The thought of creating a custom FxCop rule did occur to me, but I've never done that before, and don't know if this is even possible. At the moment, I am going through every source file and addingtry...finally
blocks that callDispose()
on allHDElement
instances :(( I was wondering if there's a better way of doing this? I am using VS 2008 but am targeting .NET 2.0. *HDElement
is part of a library provided by another team in another continent in the same company, and holds lots of unmanaged resources that the GC cannot take care of.Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
modified on Monday, January 19, 2009 11:55 AM to include framework version.
Vikram, there's a "
using
" statement in C# that does thetry...finally
thing in a nice syntax that guarantees thatDispose()
gets called. I'd have a link to the MSDN, but my access to MSDN seems to be oddly broken at the moment.Software Zen:
delete this;
-
No, this isn't a programming question, so please read properly before lynch-voting :) And if you decide to lynch vote this after all, an explanation would be appreciated. I discovered today that a core component of my app has a lot of instances of a custom type,
HDElement
*, that are not disposed of. This is causing a HUGE memory leak and it has fallen on my shoulders to remove this leak. Does anybody know of a way to see if all instances haveDispose()
called on them? The thought of creating a custom FxCop rule did occur to me, but I've never done that before, and don't know if this is even possible. At the moment, I am going through every source file and addingtry...finally
blocks that callDispose()
on allHDElement
instances :(( I was wondering if there's a better way of doing this? I am using VS 2008 but am targeting .NET 2.0. *HDElement
is part of a library provided by another team in another continent in the same company, and holds lots of unmanaged resources that the GC cannot take care of.Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
modified on Monday, January 19, 2009 11:55 AM to include framework version.
Is there a finalizer in the HDElement class and that is the Dispose pattern is properly implemented. If yes then where are you experiencing memory leaks? and why is that such a major issue are the users experiencing some issues? Now it may be that GC may not be reclaiming HDElement at a time when you expect if the bulk of the memory used by HDElement is in the unmanaged resources. If you can modify the source code of HDElement, I think you should consider AddMemoryPressure method.
-
Vikram, there's a "
using
" statement in C# that does thetry...finally
thing in a nice syntax that guarantees thatDispose()
gets called. I'd have a link to the MSDN, but my access to MSDN seems to be oddly broken at the moment.Software Zen:
delete this;
You do need to implement IDisposable and ensure that the Dispose method actually does something! I think there may be a couple of articles here that give a good overview (you can find them). If not I can send you some code if you like.
-
You do need to implement IDisposable and ensure that the Dispose method actually does something! I think there may be a couple of articles here that give a good overview (you can find them). If not I can send you some code if you like.
It sounds like Vikram already has a
Dispose()
method in place. I was merely trying to offer him a more succinct way of making sure it was called.Software Zen:
delete this;
-
It sounds like Vikram already has a
Dispose()
method in place. I was merely trying to offer him a more succinct way of making sure it was called.Software Zen:
delete this;
And a darned good way as well.
-
No, this isn't a programming question, so please read properly before lynch-voting :) And if you decide to lynch vote this after all, an explanation would be appreciated. I discovered today that a core component of my app has a lot of instances of a custom type,
HDElement
*, that are not disposed of. This is causing a HUGE memory leak and it has fallen on my shoulders to remove this leak. Does anybody know of a way to see if all instances haveDispose()
called on them? The thought of creating a custom FxCop rule did occur to me, but I've never done that before, and don't know if this is even possible. At the moment, I am going through every source file and addingtry...finally
blocks that callDispose()
on allHDElement
instances :(( I was wondering if there's a better way of doing this? I am using VS 2008 but am targeting .NET 2.0. *HDElement
is part of a library provided by another team in another continent in the same company, and holds lots of unmanaged resources that the GC cannot take care of.Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
modified on Monday, January 19, 2009 11:55 AM to include framework version.
-
No, this isn't a programming question, so please read properly before lynch-voting :) And if you decide to lynch vote this after all, an explanation would be appreciated. I discovered today that a core component of my app has a lot of instances of a custom type,
HDElement
*, that are not disposed of. This is causing a HUGE memory leak and it has fallen on my shoulders to remove this leak. Does anybody know of a way to see if all instances haveDispose()
called on them? The thought of creating a custom FxCop rule did occur to me, but I've never done that before, and don't know if this is even possible. At the moment, I am going through every source file and addingtry...finally
blocks that callDispose()
on allHDElement
instances :(( I was wondering if there's a better way of doing this? I am using VS 2008 but am targeting .NET 2.0. *HDElement
is part of a library provided by another team in another continent in the same company, and holds lots of unmanaged resources that the GC cannot take care of.Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
modified on Monday, January 19, 2009 11:55 AM to include framework version.
Mate, I reckon this falls smakc-bang in the middle of the big circle marked 'Programming questions' :D
cheers, Chris Maunder
CodeProject.com : C++ MVP
-
No, this isn't a programming question, so please read properly before lynch-voting :) And if you decide to lynch vote this after all, an explanation would be appreciated. I discovered today that a core component of my app has a lot of instances of a custom type,
HDElement
*, that are not disposed of. This is causing a HUGE memory leak and it has fallen on my shoulders to remove this leak. Does anybody know of a way to see if all instances haveDispose()
called on them? The thought of creating a custom FxCop rule did occur to me, but I've never done that before, and don't know if this is even possible. At the moment, I am going through every source file and addingtry...finally
blocks that callDispose()
on allHDElement
instances :(( I was wondering if there's a better way of doing this? I am using VS 2008 but am targeting .NET 2.0. *HDElement
is part of a library provided by another team in another continent in the same company, and holds lots of unmanaged resources that the GC cannot take care of.Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
modified on Monday, January 19, 2009 11:55 AM to include framework version.
I almost never 1 vote people.
Need software developed? Offering C# development all over the United States, ERL GLOBAL, Inc is the only call you will have to make.
If you don't ask questions the answers won't stand in your way.
Most of this sig is for Google, not ego. -
Mate, I reckon this falls smakc-bang in the middle of the big circle marked 'Programming questions' :D
cheers, Chris Maunder
CodeProject.com : C++ MVP
To be honest, I wasn't asking, "How can I avoid this memory leak?" I expected an answer like "Tool X can do this for you", or "You're buggered, you'll have to review the whole code and do it by hand". If this still qualifies as a programming question, my unqualified apologies.
Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
-
Vikram, there's a "
using
" statement in C# that does thetry...finally
thing in a nice syntax that guarantees thatDispose()
gets called. I'd have a link to the MSDN, but my access to MSDN seems to be oddly broken at the moment.Software Zen:
delete this;
Thanks for the reply, Gary, but I wasn't looking for coding tips to handle the memory leak. I know perfectly well what needs to be done, I was wondering if there is a tool that can do this for me or I had to review the entire code.
Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
-
Is there a finalizer in the HDElement class and that is the Dispose pattern is properly implemented. If yes then where are you experiencing memory leaks? and why is that such a major issue are the users experiencing some issues? Now it may be that GC may not be reclaiming HDElement at a time when you expect if the bulk of the memory used by HDElement is in the unmanaged resources. If you can modify the source code of HDElement, I think you should consider AddMemoryPressure method.
Thanks for the tip, and thanks for not flaming :) HDElement holds unmanaged resources, so the GC won't do. Modifying its source is out of question, so I will have to review all of my app's code and call Dispose manually.
Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
-
No, I can't see it. How is this anything other than a programming question?
Regards, Rob Philpott.
Thanks for the comment, Rob, but I didn't know asking for automated tools qualified as a programming question. Still, I have created a separate apology thread.
Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
-
No, this isn't a programming question, so please read properly before lynch-voting :) And if you decide to lynch vote this after all, an explanation would be appreciated. I discovered today that a core component of my app has a lot of instances of a custom type,
HDElement
*, that are not disposed of. This is causing a HUGE memory leak and it has fallen on my shoulders to remove this leak. Does anybody know of a way to see if all instances haveDispose()
called on them? The thought of creating a custom FxCop rule did occur to me, but I've never done that before, and don't know if this is even possible. At the moment, I am going through every source file and addingtry...finally
blocks that callDispose()
on allHDElement
instances :(( I was wondering if there's a better way of doing this? I am using VS 2008 but am targeting .NET 2.0. *HDElement
is part of a library provided by another team in another continent in the same company, and holds lots of unmanaged resources that the GC cannot take care of.Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
modified on Monday, January 19, 2009 11:55 AM to include framework version.
I ran into a similar problem a while back, but we owned the code for the type (you could always disassemble/assemble). My solution was to store the stack trace of the constructor of every instance of that type as a member in that type, and then in the finalizer, log the stack trace. I also ran a timer in the background that periodically called
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
. That way, the finalizer would run for all instances that did not get disposed, and I would be able to see where those instances got created. I would then run the application and try to exercise all paths in the code that deal with that type. I would then go through the log and fix code that was not disposing instances. The trick is to make sure that all code paths that involve that type are exercised, and that's what makes this non-deterministic. A tool like NCover would probably help track code coverage. You just gave me an idea - it would be nice to have a tool automate the first part (track instances and report where they are created in code). Now I know what I'll be doing over the Republic Day weekend :) Hope this helps.Regards Senthil [MVP - Visual C#] _____________________________ My Home Page |My Blog | My Articles | My Flickr | WinMacro
-
I ran into a similar problem a while back, but we owned the code for the type (you could always disassemble/assemble). My solution was to store the stack trace of the constructor of every instance of that type as a member in that type, and then in the finalizer, log the stack trace. I also ran a timer in the background that periodically called
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
. That way, the finalizer would run for all instances that did not get disposed, and I would be able to see where those instances got created. I would then run the application and try to exercise all paths in the code that deal with that type. I would then go through the log and fix code that was not disposing instances. The trick is to make sure that all code paths that involve that type are exercised, and that's what makes this non-deterministic. A tool like NCover would probably help track code coverage. You just gave me an idea - it would be nice to have a tool automate the first part (track instances and report where they are created in code). Now I know what I'll be doing over the Republic Day weekend :) Hope this helps.Regards Senthil [MVP - Visual C#] _____________________________ My Home Page |My Blog | My Articles | My Flickr | WinMacro
Thanks for your reply, Senthil. Making any changes to the type itself is out of question. I ploughed through the code today, adding Dispose() calls, and will see tomorrow if it has had any effect. If not, I'll go with your idea of logging the stack trace by inheriting the class (I hope they didn't seal it :doh: ) and replacing all HDElement instances with my subclass. Send me the link when your article is ready ;)
Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
-
I almost never 1 vote people.
Need software developed? Offering C# development all over the United States, ERL GLOBAL, Inc is the only call you will have to make.
If you don't ask questions the answers won't stand in your way.
Most of this sig is for Google, not ego.Now there's a straight line: "... only their darn stupid questions." "... monkeys on the other hand..." :-D
-
Thanks for the reply, Gary, but I wasn't looking for coding tips to handle the memory leak. I know perfectly well what needs to be done, I was wondering if there is a tool that can do this for me or I had to review the entire code.
Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
To find memory leaks in a program C# or C++ at runtime use Purify Or DevPartner For static code analysis, I am sure it is possible to create an appropriate FxCop rule. --- Adar Wesley
-
Thanks for your reply, Senthil. Making any changes to the type itself is out of question. I ploughed through the code today, adding Dispose() calls, and will see tomorrow if it has had any effect. If not, I'll go with your idea of logging the stack trace by inheriting the class (I hope they didn't seal it :doh: ) and replacing all HDElement instances with my subclass. Send me the link when your article is ready ;)
Cheers, Vıkram.
I don't suffer from insanity, I enjoy every moment of it.
If you are still working on fixing the leak, I have a basic version of my app here[^]. It uses the CLR Profiling API to track object allocations and finalizations and shows the constructor stack trace for finalized objects. Just give it the list of fully qualified names (including namespace) of the types you want to monitor and run the application - It will log all data to a file you specify. It has a couple of kinks - you'll have to give some type name i.e. you can't monitor all types, inner classes don't work if the class name is fully qualified, and the stack trace doesn't include method parameter/return types. Worth a try if you are still struggling with the leak :)
Regards Senthil [MVP - Visual C#] _____________________________ My Home Page |My Blog | My Articles | My Flickr | WinMacro
-
If you are still working on fixing the leak, I have a basic version of my app here[^]. It uses the CLR Profiling API to track object allocations and finalizations and shows the constructor stack trace for finalized objects. Just give it the list of fully qualified names (including namespace) of the types you want to monitor and run the application - It will log all data to a file you specify. It has a couple of kinks - you'll have to give some type name i.e. you can't monitor all types, inner classes don't work if the class name is fully qualified, and the stack trace doesn't include method parameter/return types. Worth a try if you are still struggling with the leak :)
Regards Senthil [MVP - Visual C#] _____________________________ My Home Page |My Blog | My Articles | My Flickr | WinMacro
Senthil, this is much appreciated. I later realized the numbers I was seeing in task manager were not accurate, and found some articles that demonstrated this (the bookmarks are at work). I have come around to the conclusion that there is probably no leak, but all that work did not go waste: I was able to bring down the memory usage by more than 25% by rewriting the code to use Dispose() and making a few calls to GC.Collect(). I've downloaded and mailed your app to my office ID so I can play with it on Monday (I don't do any dev work at home). Again, many thanks! :)
Cheers, Vıkram.
I've never ever worked anywhere where there has not been someone who given the choice I would not work with again. It's a job, you do your work, put up with the people you don't like, accept there are probably people there that don't like you a lot, and look forward to the weekends. - Josh Gray.