Finding where memory was last freed?

空扰寡人 提交于 2019-12-31 00:50:16

问题


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


回答1:


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:

  • Advanced Windows Debugging, Hewardt and Pravat
  • Debugging with PageHeap



回答2:


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.




回答3:


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.



来源:https://stackoverflow.com/questions/691794/finding-where-memory-was-last-freed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!