Memcheck 试图确定非法地址可能涉及的内容,因为这通常很有用。所以,如果它指向已经被释放的内存块,您将会收到相关信息,并知道该内存块被释放的位置。
Memcheck 为我提供了调用堆栈,其中显示了释放该对象的位置,我可以继续调试问题。是否有类似的工具可以在 Windows 上实现相同的功能,最好是免费的?
Memcheck 试图确定非法地址可能涉及的内容,因为这通常很有用。所以,如果它指向已经被释放的内存块,您将会收到相关信息,并知道该内存块被释放的位置。
Memcheck 为我提供了调用堆栈,其中显示了释放该对象的位置,我可以继续调试问题。是否有类似的工具可以在 Windows 上实现相同的功能,最好是免费的?
正如 Lailin Chen 在他对 这个 问题的回答中指出的,可以尝试以下其中一个:
Dr. Memory:https://github.com/dynamorio/drmemory
UMDH:http://support.microsoft.com/kb/268343
AppVerifier:http://msdn.microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx
对我有用的方法是编写自定义内存管理器,提供全局操作符 "new" 和 "delete",并使用 VirtualProtect 锁定每个已释放或正在使用的内存块。这样,任何尝试使用已释放的内存都会立即触发访问冲突,您可以捕获并调试它。但是,为了能够做到这一点,您必须使用类似于 VirtualAlloc
的东西 "抓住" 所有可用内存(或其中的 3/4),并且您返回的每个内存块(从此最初分配的块中)必须是 PAGE_SIZE
对齐的(请参阅 GetSystemInfo
文档),否则您将无法可靠地锁定它。这意味着即使是微不足道的应用程序也可能需要大量内存才能使用此方法。
至于“Windows下的valgrind替代品”-我没有听说过。有人在某个地方发布说可能可以使用 cygwin 编译/使用 valgrind,但我不知道这是否为真。
以下是一个勇敢的Valgrind尝试,我祝他们一切顺利:
http://sourceforge.net/p/valgrind4win/wiki/Home/
然而,为了实现适用于Windows的正确的“Valgrind”,需要访问Windows源代码。
也就是说:除非猪会飞。
-delay_frees_stack
的选项,其功能与Valgrind完全相同。来自选项参考页面的说明:-delay_frees_stack
default: false
Record callstacks on free to use when reporting use-after-free or other errors that overlap with freed objects. There is a slight performance hit incurred by this feature for malloc-intensive applications.
下面是Dr. Memory报告的一个错误示例:
Here is another example, using the -delay_frees_stack option to obtain the callstack of the freed memory:
Error #8: UNADDRESSABLE ACCESS: reading 0x001338a8-0x001338ac 4 byte(s)
# 0 unaddr_test1 [e:\derek\drmemory\git\src\tests\suppress.c:110]
# 1 test [e:\derek\drmemory\git\src\tests\suppress.c:269]
# 2 main [e:\derek\drmemory\git\src\tests\suppress.c:297]
Note: @0:00:02.141 in thread 3024
Note: next higher malloc: 0x001338e8-0x00133938
Note: prev lower malloc: 0x001337e8-0x00133820
Note: 0x001338a8-0x001338ac overlaps memory 0x001338a8-0x001338c4 that was freed here:
Note: # 0 test [e:\derek\drmemory\git\src\tests\suppress.c:269]
Note: # 1 main [e:\derek\drmemory\git\src\tests\suppress.c:297]
Note: instruction: mov (%eax) -> %eax
对我来说最有效的方法是使用Visual leak Detector,我所需要做的就是包含:
#include <vld.h>
我想在测试可执行文件时添加内存泄漏检测功能。然后,在Windows系统中运行调试可执行文件时,会提供有关所有泄漏内存的详细信息。从输出结果中,您可以直接找到内存分配的代码行,以便进行修复。