是否有类似 Valgrind Memcheck 的工具,用于在出现免费错误后调试 Windows 使用? [关闭]
Posted
技术标签:
【中文标题】是否有类似 Valgrind Memcheck 的工具,用于在出现免费错误后调试 Windows 使用? [关闭]【英文标题】:Is there Valgrind Memcheck like tool for windows to debug use after free errors? [closed] 【发布时间】:2012-03-28 16:31:28 【问题描述】:在我的工作中,我经常遇到相当常见的编程错误——使用一些已经被释放的对象。这会在 C++ 中调用 UB。在 linux 上,这类问题通常使用 Valgrind 工具 Memcheck 来解决。来自Memcheck manual:
Memcheck 试图确定非法地址可能与什么有关, 因为这通常很有用。所以,如果它指向一块内存 它已经被释放,你会被告知这一点,而且 块被释放的地方。
Memcheck 为我提供调用堆栈,其中对象已被释放,我可以继续调试问题。 windows 是否有类似的工具,具有相同的功能,最好是免费的?
【问题讨论】:
我过去在 Purify 上运气不错,但它绝对不是免费的。 ***.com/questions/413477/… 如果您只对 C 的答案感兴趣,我有一个。 【参考方案1】:正如陈来林在回答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
【讨论】:
我试过 AppVerifier,它不知道对象在哪里被释放。 应用程序验证程序应该通过完整的内存保护来捕获这一点。当您释放该对象时,它会保护已释放的页面,从而导致以后对其进行的任何操作都会引发异常。 AppVerifier 很垃圾,当使用它运行程序时会触发 intel TBB 代码中的断点......糟糕的程序,但如果你禁用该检查,idk 可能没问题【参考方案2】:The method that worked for me 是编写自定义内存管理器,提供全局运算符“new”和“delete”,并使用 VirtualProtect 锁定每个释放/使用的内存块。这样,任何使用释放内存的尝试都会立即触发访问冲突,您可以捕获和调试。但是,为了能够做到这一点,您必须使用类似 VirtualAlloc
的东西“获取”所有可用内存(或其中的 3/4),并且您返回的每个内存块(从这个最初分配的块中)必须与 PAGE_SIZE
对齐(请参阅GetSystemInfo
文档),否则您将无法可靠地锁定它。这意味着即使是微不足道的应用程序也可能需要大量内存才能使用此方法。
至于“Windows 的 valgrind 替代品”——我还没有听说过。有人在某处发帖说可能可以用 cygwin 编译/使用 valgrind,但我不知道这是否属实。
【讨论】:
【参考方案3】:这是一次勇敢的 Valgring 尝试,我祝他们一切顺利:
http://sourceforge.net/p/valgrind4win/wiki/Home/
不过,我担心,为了实现合适的“Valgrind for Windows”,需要访问 Windows 源代码。
IOW:当猪飞时。
【讨论】:
为什么需要访问 Windows 源代码?【参考方案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
【讨论】:
【参考方案5】:最适合我的是使用Visual leak Detector,我需要做的就是包括:
#include <vld.h>
在我想测试的可执行文件的开头。然后从 Windows 中运行调试可执行文件,将提供有关所有泄漏内存的详细信息。从输出中你可以直接得到内存被分配的那一行,所以你可以小心
【讨论】:
以上是关于是否有类似 Valgrind Memcheck 的工具,用于在出现免费错误后调试 Windows 使用? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Valgrind:致命错误:memcheck.h:没有这样的文件或目录