Finding where memory was last freed?
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
Yes!
Install the Windows Debugging Tools and use Application Verifier.
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:
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.
No, not unless you provide your own allocators (eg 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.
链接地址: http://www.djcxy.com/p/82288.html上一篇: Boost :: asio这种奇怪的编码风格是什么?
下一篇: 寻找上次释放内存的位置?