有没有适用于Windows的好的Valgrind替代品?

210

当我在寻找帮助改进我的C语言编程和调试的工具时,我发现Valgrind仅适用于Linux操作系统。由于我没有将操作系统转移到Linux的其他需要或兴趣,因此我想知道是否有同样优秀的程序适用于Windows。


你想要进行哪种类型的调试?Valgrind是一个非常丰富的工具集,下面的答案指向各种不同的方向。重点在于内存泄漏/分配调试。 - jakobengblom2
1
也许你可以在 Windows 环境内的虚拟 Linux 机器上测试代码,只有在需要检查时才这么做。你可以在虚拟和非虚拟机之间共享开发文件夹。前提是,如果代码足够可移植。 - Liran Orevi
38个回答

117
作为jakobengblom2指出的,valgrind有一套工具。根据你所讨论的工具不同,有不同的Windows对应工具。我将只在此处提到OSS或免费工具。
1. MemCheck:
Dr. Memory。这是一个相对较新的工具,在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. Callgrind:

我的最爱是verysleepy(http://www.codersnotes.com/sleepy)。它很小但非常有用且易于使用。

如果您需要更多功能,AMD CodeAnalyst™ Performance Analyzer是免费的: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. Massif:

类似(但不完全相同)的免费工具在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. Cachegrind:

上述的Windows性能工具具有一定程度的L2缓存未命中分析功能,但不如Cachegrind好用和易用。

5. DRD:

目前在Windows上还没有找到免费且功能强大的工具,我能找到的唯一一个稍微接近的免费工具是AppVerifier中的“锁定”检查器: http://msdn.microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx


2
还有gperftools(前身为Google PerfTools)。它不是valgrind的替代品(真正的替代品是什么),但它具有新的malloc、CPU分析器、堆分析器和检查器。值得一看,因为它支持Linux和Windows(包括Mingw)以及其他Unix系统。 - alexr

31
为什么不使用Valgrind + Wine来调试您的Windows应用程序?请参见 http://wiki.winehq.org/Wine_and_Valgrind (Chromium使用此方法检查Windows版本以查找内存错误;请参见build.chromium.org并查看实验或内存瀑布,然后搜索wine。)
还有Dr. Memory,请参见dynamorio.org/drmemory.html

3
因为那样你就不是在调试 Windows 应用程序了,而是在调试 Linux 应用程序。 - John Dibling
33
无需在Wine中重新编译。只需将您的 .exe 和 .pdb 文件传输到Linux系统上即可。而且您不会调试Linux应用程序;您正在调试您准确的Windows应用程序。 - Dan Kegel

29

1
净化器:虽然经历了许多公司所有权的变更,但仍然非常有用,值得尊敬! - Norman Ramsey
2
Insure++需要花费很长时间来对您的代码进行插桩,并且在运行时执行您的代码也需要很长时间。 - C.J.

15

如果你使用的是Visual C++,可以尝试使用Visual Leak Detector。我使用它时,它可以检测到new调用导致的内存泄漏,并且返回泄漏源代码中实际的行数。最新版本可以在http://vld.codeplex.com/找到。


它对我似乎不起作用。我甚至尝试创建一个简单的项目,除了分配一些内存并不释放它之外,什么也没做。VLD没有检测到它。 :-| - Synetech
@Synetech公司。我在VS2010中也遇到了同样的问题...使用最新版本的VLD解决了我的问题。 - relaxxx

14

6
它的实际作用非常有限。它会记录出错分配的文件名/行号,但只有在您直接调用malloc时才具有信息价值。当使用new/delete时,它会不适当地将new.h指定为“有问题”的代码。 - user9665
3
对我来说它正常工作,即使使用了new/delete,也能指向正确的行。 - Rodrigo
但如果一个库函数分配内存,它会起作用吗?例如 strdup。 - Alex Budovski
调试CRT是您试图描述的内容,对于C代码非常有用。但是让它在C++代码中工作就更加棘手了。 - C.J.
1
Valgrind 不仅可以找到内存泄漏,我主要使用它来查找已释放和未初始化的堆栈和堆内存,否则这些问题将非常难以调试。 - ideasman42
1
@user9665 Visual Leak Detector(http://vld.codeplex.com)提供了每个内存泄漏的完整调用堆栈,只需进行最小的源代码更改即可。请在网站上查看示例。 - KindDragon

14

我想列举一些工具,希望能够有所帮助

阅读此文章以了解更多详情

  1. Purify
  2. Bounds Checker
  3. Coverity (基本上它是一个代码分析器,但它会静态地捕获内存泄漏)
  4. Glow Code
  5. dmalloc
  6. ccmalloc
  7. NJAMD
  8. YAMD
  9. Valgrind
  10. mpatrol
  11. Insure++

13

12

Pageheap/gflags 帮助我解决了一些恶心的堆栈损坏问题。 - the_mandrill
我发现在诊断中使用gflags和来自mingw的gdb很有帮助。 - Jarekczek

8

与Visual Studio结合使用,我通常使用Visual Leak Detector或简单地使用win32 api调用_CrtDumpMemoryLeaks()。这两种方法都不是很花哨,但它们可以完成工作。


6

我曾经有机会使用Compuware DevPartner Studio,那真的很好,但是它相当昂贵。 一个更便宜的解决方案可能是GlowCode,我刚刚使用了5.x版本,尽管在附加到我需要调试的进程时遇到了一些问题,但它表现得非常好。


昂贵是的。但仅使用分析器工具,它在一个周末内就回本了。 - EvilTeach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接