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.

  • File -> Add Application, select your .exe
  • Under Basics, select Memory and Heaps.
  • Run the debug build of your program under ntsd (ntsd yourprogram.exe).
  • 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

  • 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这种奇怪的编码风格是什么?

    下一篇: 寻找上次释放内存的位置?