是否有类似Valgrind Memcheck的工具,用于在没有错误后进行调试使用
Is there Valgrind Memcheck like tool for windows to debug use after free errors?
在我的工作中,我经常面临相当常见的编程错误——使用一些已经释放的对象。这将调用C++中的UB。在linux上,这类问题通常通过使用Valgrind工具Memcheck来解决。来自Memcheck手册:
Memcheck试图确定非法地址可能与什么有关,因为这通常很有用。所以,如果它指向一个内存块它已经被释放,你会被告知这一点,而且在那里块被释放。
Memcheck为我提供了调用堆栈,在那里释放对象,我可以继续调试问题。windows是否有类似的工具具有相同的功能,最好是免费的?
正如陈莱林在回答这个问题时指出的那样,试试其中一个:
Dr。内存:https://github.com/dynamorio/drmemory
UMDH:http://support.microsoft.com/kb/268343
应用程序验证程序:http://msdn.microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx
对我有效的方法是编写自定义内存管理器,提供全局运算符"new"answers"delete",并使用VirtualProtect锁定每个释放/使用的内存块。这样,任何使用释放内存的尝试都会立即触发访问冲突,您可以捕获并调试该冲突。然而,要做到这一点,您必须使用类似VirtualAlloc
的东西"获取"所有可用内存(或其3/4),并且您返回的每个内存块(从最初分配的块)都必须与PAGE_SIZE
对齐(请参阅GetSystemInfo
文档),否则您将无法可靠地锁定它。这意味着即使是微不足道的应用程序也可能需要大量内存才能使用此方法。
至于"windows的valgrind替代方案"-我还没有听说过。有人在某个地方发帖说,可能可以用cygwin编译/使用valgrind,但我不知道这是真是假。
这是一次勇敢的Valgring尝试,我祝他们一切顺利:
http://sourceforge.net/p/valgrind4win/wiki/Home/
不过,我担心,为了实现一个合适的"Valgrind for Windows",需要访问Windows源代码。
当猪飞起来的时候。
根据Dr.Memory文档,有一个-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:derekdrmemorygitsrctestssuppress.c:110]
# 1 test [e:derekdrmemorygitsrctestssuppress.c:269]
# 2 main [e:derekdrmemorygitsrctestssuppress.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:derekdrmemorygitsrctestssuppress.c:269]
Note: # 1 main [e:derekdrmemorygitsrctestssuppress.c:297]
Note: instruction: mov (%eax) -> %eax
对我来说最有效的是使用视觉泄漏检测器,我所需要做的就是包括:
#include <vld.h>
在我想要测试的可执行文件的开头。然后从窗口中运行调试可执行文件,将提供有关所有泄漏内存的详细信息。从输出中,您可以直接到达分配内存的行,因此您可以注意
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 我的代码中有错误,未声明的标识符
- C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
- 试图建立银行管理系统,但有错误
- 我试图创建临时对象的方式有错误吗
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 我在OpenCV中有错误的"approxPolyDP(ROI_Vertices, ROI_Poly, 1.0, true)"
- 我在这个 C++ 代码上有错误吗?
- 是视觉C++优化器错误还是我的代码中有错误?
- 全球免费给出一个错误.调试器不解释
- 为什么一个简单的C++程序会有错误的结果?是 #define 引起的吗?
- 对此有错误
- C :数据文件有错误:预期的无限制ID
- 一个带有参数的程序,为什么此程序有错误的答案
- 仅使用boost.datetime在Windows上有错误
- 使用向量循环时,是否有错误
- Microsoft Visual Studio发现我所有的CUDA设备端函数都有错误
- LNK1124错误调试器找不到.exe文件
- 我有视觉工作室错误调试断言失败
- Valgrind+gdb用MPI调试,库中有错误