当我发现 Valgrind 仅适用于 Linux 时,我正在研究 Valgrind 以帮助改进我的 C 编码/调试——我没有其他需要或兴趣将我的操作系统迁移到 Linux,所以我想知道是否有适用于 Windows 的同样好的程序。
38 回答
正如 jakobengblom2 所指出的,valgrind 有一套工具。根据您所谈论的,有不同的 Windows 柜台部件。我这里只提OSS或者免费工具。
1. 内存检查:
记忆博士。这是一个相对较新的工具,在 Windows 7 上运行良好。我最喜欢的功能是它在报告中将相同的泄漏分配堆栈分组。
http://code.google.com/p/drmemory/
我也使用过 UMDH(http://support.microsoft.com/kb/268343),发现它非常有用且易于设置。它适用于Win2000到Win7。
AppVerifier 是 Windows 本机代码开发人员必备的瑞士刀,它的“内存”检查器做类似的工作 http://msdn.microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx
2.呼叫研磨:
我最喜欢的是verysleepy(http://www.codersnotes.com/sleepy)它很小但非常有用且易于使用。
如果您需要更多功能,AMD CodeAnalyst™ 性能分析器是免费的:http: //developer.amd.com/documentation/videos/pages/introductiontoamdcodeanalystperformanceanalyzer.aspx
Windows 性能分析工具是微软免费提供的,不是很容易使用,但如果你愿意花时间,可以完成工作。http://blogs.microsoft.co.il/blogs/sasha/archive/2008/03/15/xperf-windows-performance-toolkit.aspx 下载:http: //msdn.microsoft.com/en-us/performance /cc752957
3.地块:
Windows 上类似(不完全匹配)的免费工具有:
来自 sysinternals 的 VMMap:http ://technet.microsoft.com/en-us/sysinternals/dd535533
windbg 中的 !heap 命令:http: //hacksoflife.blogspot.com/2009/06/heap-debugging-memoryresource-leak-with.html
4.缓存研磨:
上面提到的 Windows 性能工具具有一定水平的 L2 缓存未命中分析能力,但不如 Cachegrind 好和易于使用。
5.DRD:
还没有在 Windows 上找到任何免费且功能强大的东西,我能找到的唯一一个稍微接近的免费 Windows 工具是 AppVerifier 中的“锁定”检查器:http: //msdn.microsoft.com/en-us/library /dd371695%28v=vs.85%29.aspx
为什么不使用 Valgrind + Wine 来调试您的 Windows 应用程序?见 http://wiki.winehq.org/Wine_and_Valgrind
(Chromium 使用它来检查 Windows 版本的内存错误;请参阅 build.chromium.org 并查看实验或内存瀑布,并搜索 wine。)
还有 Dr. Memory,见 dynamorio.org/drmemory.html
对于 Visual C++,请尝试Visual Leak Detector。当我使用它时,它检测到来自调用的内存泄漏new
并返回泄漏源代码中的实际行。最新版本可以在http://vld.codeplex.com/找到。
您使用的 Windows 开发环境可能包含它自己的工具。例如,Visual Studio 可让您检测和隔离程序中的内存泄漏
我想列出一些工具,希望会有用
阅读本文了解更多详情
- 净化
- 边界检查器
- Coverity(基本上它是一个代码分析器,但它会在 static 中捕获内存泄漏)
- 发光代码
- dmalloc
- ccmalloc
- NJAMD
- YAMD
- 瓦尔格林德
- 巡逻队
- 保险++
试试杜马
Windows 调试工具中有 Pageheap.exe 部分。它是免费的,基本上是一个自定义内存分配器/释放器。
结合 Visual Studio,我通常使用Visual Leak Detector或简单的 _CrtDumpMemoryLeaks() 这是一个 win32 api 调用。两者都没有什么花哨的,但他们完成了工作。
过去我有机会使用Compuware DevPartner Studio,这非常好,但价格相当昂贵。一个更便宜的解决方案可能是GlowCode,我刚刚使用 5.x 版本,尽管在附加到我需要调试的进程时存在一些问题,但它运行得很好。
我一直很喜欢Memory Validator,来自一家名为 Software Verification 的公司。
Visual Studio 可以帮助自己检测内存泄漏。请参阅Microsoft Visual C++ 提示和技巧-> “内存泄漏”部分。另见SO中的这篇文章
尽管只有 Visual Studio 的 Team Edtion 才能进行真正的跟踪。
有关类似工具的列表,请参阅软件 QA 测试和测试工具资源页面上的“源测试工具”链接。
我过去曾使用过 BoundsChecker、DevPartner Studio 和 Intel V-Tune 进行分析。我最喜欢 V-Tune;您可以模拟各种英特尔芯片组,它会为您提供有关如何针对该平台进行优化的提示。
净化器怎么样?
Jochen Kalmbach 的内存泄漏检测器是否符合条件?
PS:最新版本的网址隐藏在文章的评论线程中。
LeakDiag、UMDH、App Verifier、DebugDiag,都是提高代码健壮性和发现内存泄漏的有用工具。
Boost Test 库可以检测内存泄漏。
试试英特尔的 Inspector XE 产品,它可以帮助您检测内存和线程问题: http: //software.intel.com/en-us/articles/intel-inspector-xe/
也许 CodeSnitch 会是你追求的东西?http://www.entrek.com/codesnitch.html
如果您使用 Borland/CodeGear/Embarcadero C++ Builder 进行开发,您可以使用 CodeGuard。
所有 Profiler 或多或少都包括检查内存泄漏并在分配内存时向您显示堆栈。
我可以推荐Intels Parallel Inspector。使用简单,无需重新编译。试用版运行 30 天。
GlowCode和AtromatedQA也包括此类功能。他们都提供免费试用。
对比中的 Compuware DevPartner(又名 BoundsChecker)需要减慢“仪器”重新编译速度,并且在检查错误时应用程序运行速度也会变慢。并且 BoundsChecker 根本无法与 64 位 evsrions 一起使用。我们放弃了那个工具。
我用过的最好的工具是DevPartner BoundsChecker——它不是免费的,但它有一个评估期。
您列表的另一个记忆工具:Memory Validator。
不是免费的,但远没有 Purify 或 Boundschecker 贵。
如果您不怕 mingw,这里有一些链接(有些可能适用于 MSVC)... http://betterlogic.com/roger/?p=1140
我们刚刚完成了一个用于 Windows 的内存安全检查工具,它可以处理 GCC 和 Micrsoft Visual C(还不是 C++),并且正在寻找 Beta 测试人员。
编辑 2011 年 6 月 12 日:不再是 Beta,现在为 GCC 和 Microsoft Visual Studio C 生产。
我今天发现了这个 SF 项目:
http://sourceforge.net/p/valgrind4win/wiki/Home/
他们正在将 valgrind 移植到 Windows。可能在几年后,我们将在 windows 上拥有一个可靠的 valgrind。
看看这个问题:Windows 有没有好的 Valgrind 替代品?. 虽然有人询问了 valgrind 的一般替代品,但它主要讨论的是内存泄漏检测器,而不是竞争条件检测。
我使用了 Insure++,它在查找 c++ 内存泄漏/损坏和许多其他错误(如未初始化的变量、指针错误、字符串等)方面做得非常出色,它还可以进行可视化“代码覆盖”和运行时内存使用等。您的代码..您可以尝试试用版..
您可能想阅读 Mozilla关于内存泄漏的做法。他们工具箱中的一个工具是用作内存泄漏检测器的 Hans Boehm 垃圾收集器。
您可以尝试RuntimeChecker试用版或IBM Purify试用版。
一个免费的解决方案是在 Visual Studio 中使用以下代码:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
只需将其写在所有 cpp 文件的顶部即可。这将在停止调试运行并在输出窗口中列出它们时检测应用程序的内存泄漏。双击内存泄漏行将突出显示分配内存且从未释放的行。这可能会对您有所帮助: http: //www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml
用户模式转储堆 (UMDH) 实用程序与操作系统一起分析特定进程的 Windows 堆分配。这是微软免费提供的一个非常好的工具。这是一个迷你教程“如何使用 Umdh.exe 查找内存泄漏”。
免费工具 DebugDiag 将帮助查找内存和处理泄漏。
您无需为 DebugDiag 工作而增强您的程序。
虽然它不是最简单或最直观的程序!确保您在谷歌上搜索有关如何使用它的教程和说明。
你可以看看《Game Programming Gems 8》一书中的文章Design and Implementation of an In-Game Memory Profiler 。
它展示了如何实现一个低开销的半侵入式实时内存分析器,源代码在 CD-ROM 中提供。
Clang 支持 Address Sanitizer 插件(-faddress-sanitizer 选项),它几乎可以检测到 Valgrind 可以找到的大多数错误(虽然不支持检测未初始化的内存读取和内存泄漏)。有关与 Valgrind 和其他类似工具的比较,请参阅此页面。官方 Windows 端口目前正在进行中,请参阅Windows ASan 端口。
几个月前,我尝试自己在 Windows 上构建它并放弃了,请参阅我的相关问题。如果您想再试一次,现在情况可能会变得更好。
只是一个想法,您还可以实现内存分配器并跟踪对 malloc 和 free 的所有调用。然而,这对于某些项目来说可能太多了。
Parasoft Insure++ 一直很可靠: