是否有Valgrind Memcheck之类的工具用于Windows免费错误后调试使用?

时间:2012-03-28 16:31:28

标签: c++ windows debugging valgrind

在我的工作中,我经常面对相当常见的编程错误 - 使用一些已被释放的对象。这在C ++中调用UB。在 linux 上,通常使用Valgrind工具Memcheck解决此类问题。来自Memcheck manual

  

Memcheck尝试确定非法地址可能涉及的内容,   因为那通常很有用。所以,如果它指向一块内存   已经被释放的,你会被告知这一点,也是   块被释放的地方。

Memcheck为我提供了调用堆栈,对象被解除分配,我可以继续调试问题。是否有类似的功能 windows 具有相同的功能,最好是免费的?

5 个答案:

答案 0 :(得分:17)

正如Lailin Chen在回答this问题时所指出的那样,试试其中一个:

博士。记忆: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

答案 1 :(得分:5)

The method that worked for me是编写自定义内存管理器,提供全局操作符“new”和“delete”,并使用VirtualProtect锁定每个释放/已释放的内存块。这样,任何使用释放内存的尝试都会立即触发您可以捕获和调试的访问冲突。但是,为了能够执行此操作,您必须使用类似VirtualAlloc之类的内容“抓取”所有可用内存(或3/4)并且您返回的每个内存块(来自此初始分配的块)必须为{{ 1}}对齐(请参阅PAGE_SIZE文档),否则您将无法可靠地锁定它。这意味着即使是简单的应用程序也可能需要大量内存才能使用此方法。

至于“valgrind替代Windows” - 我没听说过。有人在某处发布了可能用cygwin编译/使用valgrind,但我不知道这是否属实。

答案 2 :(得分:4)

这是一次勇敢的Valgring尝试,我祝他们最好:

http://sourceforge.net/p/valgrind4win/wiki/Home/

但是,我担心,为了实现适当的“Valgrind for Windows”,需要访问Windows源代码。

IOW:猪飞的时候。

答案 3 :(得分:4)

根据Dr. Memory文档,有-delay_frees_stack选项具有完全相同的Valgrind功能。来自Option Reference

-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.

此处还有一个error reported by 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

答案 4 :(得分:3)

最适合我的是使用Visual leak Detector,我需要做的就是包括:

#include <vld.h>

在我想测试的可执行文件的开头。然后从Windows中运行调试可执行文件,将提供有关所有泄漏内存的详细信息。从输出中,您可以直接到达分配内存的行,因此您可以小心