views:

207

answers:

3

Very general: Is there an easy way to tell which line of code last freed a block of memory when an access violation occurs?

Less general: My understanding of profilers is that they override the allocation and deallocation processes. If this is true, might they happen to store the line of code that last freed a section of memory so that when it later crashes because of an access violation, you know what freed it last?

Specifics: Windows, ANSI C, using Visual Studio

A: 

No, not unless you provide your own allocators (e.g. by overloading new/delete) to store this information.

What profilers do is highly dependent on what they're profiling. I'm not aware of any profiler that tracks what you're looking for.

Perhaps if you provided more details on your situation people could suggest an alternative means of diagnosing the problem you're encountering.

Andrew Grant
Sydius asks about c, so you want malloc/free rather than new/delete...
dmckee
e.g.= example. In this case use a custom/malloc free in your app, which if memory performance is important you will already have.
Andrew Grant
A: 

Short answer: no.

What you need is a debug malloc. I don't keep up with Windows any longer but there are several about, including this free one.

Update

Looks like Visual Studio C has a built in version. See here

When the application is linked with a debug version of the C run-time libraries, malloc resolves to _malloc_dbg. For more information about how the heap is managed during the debugging process, see The CRT Debug Heap.

... and see here for _malloc_dbg.

Charlie Martin
+5  A: 

Yes!

Install the Windows Debugging Tools and use Application Verifier.

  1. File -> Add Application, select your .exe
  2. Under Basics, select Memory and Heaps.
  3. Run the debug build of your program under ntsd (ntsd yourprogram.exe).
  4. Reproduce the bug.

Now when you make the crash happen, you will get additional information in the debugger from AppVerifier. Use !avrf (may take a long time to run (minutes)) and it will try to give you as much useful information as possible.

You can all use the dps command on the memory address to get all the stored stack info (allocation, deallocation, etc).

You can also use the !heap command on the memory address:

0:004> !heap -p -a 0x0C46CFE0

Which will dump information as well.

Further Reading:

jeffamaphone