有没有好的 Valgrind 替代品来替代 Windows?

Is there a good Valgrind substitute for Windows?

提问人:Drake 提问时间:1/5/2009 最后编辑:KindDragonDrake 更新时间:1/24/2013 访问量:396111

问:

已锁定。这个问题及其答案被锁定,因为这个问题偏离了主题,但具有历史意义。它目前不接受新的答案或交互。

当我发现它仅适用于 Linux 时,我正在研究 Valgrind 以帮助改进我的 C 编码/调试 - 我没有其他需要或兴趣将我的操作系统迁移到 Linux,所以我想知道是否有同样好的程序适用于 Windows。

C Windows 调试 内存泄漏 Valgrind

评论

0赞 jakobengblom2 8/28/2009
您希望进行哪些类型的调试?Valgrind 是一个相当丰富的工具集,下面的答案指向各种方向。重点是内存泄漏/分配调试。
1赞 Liran Orevi 10/1/2009
也许您可以在 Windows 内的虚拟 Linux 机器上测试代码,只是在您需要检查它的时候。您可以在虚拟机和非虚拟机之间共享开发文件夹。也就是说,如果代码足够可移植。

答:

6赞 Manuel 1/5/2009 #1

我过去曾有机会使用 Compuware DevPartner Studio,这真的很好,但它非常昂贵。 更便宜的解决方案可能是 GlowCode,我刚刚使用了 5.x 版本,尽管在附加到我需要调试的进程时存在一些问题,但它运行良好。

评论

0赞 EvilTeach 1/6/2009
贵的,是的。它只用了一个周末就收回了成本,只是使用了分析器。
4赞 Patrick Cuff 1/5/2009 #2

有关类似工具的列表,请参阅软件 QA 测试和测试工具资源页面上的“源测试工具”链接。

我过去曾使用 BoundsChecker、DevPartner Studio 和英特尔 V-Tune 进行性能分析。我最喜欢 V-Tune;您可以模拟各种英特尔芯片组,它会为您提供有关如何针对该平台进行优化的提示。

2赞 Alex Fort 1/5/2009 #3

也许 CodeSnitch 会是你所追求的?http://www.entrek.com/codesnitch.html

6赞 stevex 1/5/2009 #4

我一直很喜欢Memory Validator,它来自一家名为Software Verification的公司。

14赞 dmityugov 1/6/2009 #5

您正在使用的 Windows 开发环境可能包含自己的工具。例如,Visual Studio 允许您检测和隔离程序中的内存泄漏

评论

6赞 user9665 4/9/2009
它几乎没有实际用途。它将记录有问题的分配的文件名/行号,但只有在您直接调用 malloc 时才提供信息。当使用 new/delete 时,它会无助地将 new.h 确定为“违规”代码。
3赞 Rodrigo 4/23/2009
它对我来说工作正常,即使使用新的/删除,也指向正确的行。
0赞 Alex Budovski 12/14/2009
但是,如果库函数分配,它会起作用吗?例如 strdup。
1赞 ideasman42 8/10/2011
Valdrind 做了更多的事情,然后发现内存泄漏,我主要用它来查找释放和未初始化的堆栈和堆内存的使用,否则调试起来可能非常困难。
1赞 KindDragon 4/20/2012
@user9665 Visual Leak Detector (vld.codeplex.com) 为每个内存泄漏提供完整的调用堆栈,只需最少的源代码更改。在现场查看示例
29赞 orip 1/6/2009 #6

一些更好的商业工具:

评论

1赞 Norman Ramsey 1/6/2009
净化:令人尊敬但仍然有用,正如它幸存下来的公司所有权变更所表明的那样!
2赞 C.J. 8/9/2010
Insure++ 需要很长时间来检测您的代码,并且永远需要在运行时执行您的代码。
12赞 user88930 4/9/2009 #7

Windows调试工具中有Pageheap.exe部分。它是免费的,基本上是一个自定义内存分配器/释放器。

查看 http://support.microsoft.com/kb/286470

评论

0赞 the_mandrill 6/23/2010
Pageheap/gflags 帮助我深入了解了一些令人讨厌的堆损坏问题。
0赞 Jarekczek 10/31/2012
我发现+(来自mingw)有助于诊断。gflagsgdb
2赞 Vince 7/16/2009 #8

如果您使用Borland/CodeGear/Embarcadero C++ Builder进行开发,则可以使用CodeGuard。

13赞 Diaa Sami 8/28/2009 #9

试用 DUMA

15赞 tgs_stdio 8/30/2009 #10

对于 Visual C++,请尝试 Visual Leak Detector。当我使用它时,它检测到调用中的内存泄漏,并在泄漏的源代码中返回实际行。最新版本可在 http://vld.codeplex.com/ 上找到。new

评论

0赞 Synetech 8/25/2010
它似乎对我不起作用。我什至尝试创建一个简单的项目,除了分配一些内存而不是释放它之外,基本上什么也没做。VLD 未检测到它。:-|
0赞 relaxxx 4/8/2011
@Synetech公司我在 VS2010 中遇到了同样的问题......使用最新版本的VLD解决了我的问题
3赞 grigy 10/1/2009 #11

净化怎么样?

评论

0赞 David Rodríguez - dribeas 10/1/2009
不是真的免费...但我想你可以找到一个用于测试目的的测试许可证。
0赞 dwj 2/5/2011
截至 2011 年 2 月 4 日,BoundsChecker 的死链接。
1赞 maykeye 10/1/2009 #12

看看这个问题: 有没有一个好的 Valgrind 替代品来替代 Windows?.虽然提出了 valgrind 的一般替代品,但它主要讨论内存泄漏检测器,而不是竞争条件检测。

1赞 Rob Wells 10/1/2009 #13

绝对净化!我用它来分析一些庞大的代码库(>3,000 kSLOC),发现它非常出色。

你可能想在维基百科上查看这个列表

顺便说一句,我发现 memwatch 很有用。谢谢约翰!

5赞 fmuecke 10/1/2009 #14

Viusual Studio 可以帮助检测内存泄漏本身。请参阅Microsoft Visual C++ Tips and Tricks -> “内存泄漏”部分。 另请参阅SO中的这篇文章

尽管只有使用 Visual Studio 的 Team Edtion 才能进行真正的跟踪。

2赞 RED SOFT ADAIR 10/1/2009 #15

或多或少,所有 Profiler 都包括检查内存泄漏,并在分配内存时显示堆栈。

我可以推荐英特尔的 Parallel Inspector。简单易用,无需重新编译。试用版的有效期为 30 天。

GlowCodeAtromatedQA 也包含此类功能。他们都提供免费试用。

相比之下,Compuware DevPartner(又名 BoundsChecker)需要放慢速度的“检测”重新编译,并且应用程序在检查错误时也会运行得更慢。而且 BoundsChecker 根本无法与 64 位 evsrions 一起使用。我们放弃了这个工具。

评论

2赞 Bob 10/1/2009
我绝对推荐 glowcode。我过去曾用它来查找我的应用程序调用的 dll 中的内存泄漏。
0赞 Calyth 10/1/2009
有人抱怨在我上一个工作场所使用 DevPartner 时速度严重变慢。他们尽一切努力避免使用它,因为它会很慢。
1赞 Red 10/1/2009 #16

我使用了 Insure++,它在查找 c++ 内存泄漏/损坏和许多其他错误(如未初始化的变量、指针错误、字符串等)方面做得非常出色,它还具有视觉“代码覆盖率”和运行时内存使用情况等。这让你的代码更有信心。您可以尝试试用试用版。.

8赞 Jasper Bekkers 10/1/2009 #17

结合 Visual Studio,我通常使用 Visual Leak Detector 或简单的 _CrtDumpMemoryLeaks(),这是一个 win32 api 调用。两者都没什么花哨的,但它们可以完成工作。

2赞 Dror Helper 10/1/2009 #18

我用过的最好的工具是 DevPartner BoundsChecker - 它不是免费的,但它有一个评估期。

1赞 Cristian Adam 10/1/2009 #19

您可能想了解Mozilla在内存泄漏方面所做的工作。他们工具箱中的一个工具是用作内存泄漏检测器的 Hans Boehm 垃圾收集器。

1赞 Patrice Bernassola 10/1/2009 #20

您可以尝试 RuntimeChecker 试用版或 IBM Purify 试用版。

一个免费的解决方案是在 Visual Studio 中使用以下代码:

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

只需将其写在所有 cpp 文件的顶部即可。 这将在停止调试运行时检测应用程序的内存泄漏,并在输出窗口中列出它们。双击内存泄漏行将突出显示分配内存且永不释放的行。这可能对您有所帮助:http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml

14赞 Satbir 10/1/2009 #21

我想列出一些工具,希望有用

阅读本文了解更多详情

  1. 净化
  2. 边界检查器
  3. Coverity(基本上它是一个代码分析器,但它会在静态中捕获内存泄漏)
  4. 发光代码
  5. 德马洛克
  6. ccmalloc
  7. NJAMD的
  8. YAMD公司
  9. 瓦尔格林德
  10. mpatrol
  11. 投保++
1赞 Kirill V. Lyadvinsky 10/2/2009 #22

用户模式转储堆 (UMDH) 实用工具与操作系统配合使用,以分析特定进程的 Windows 堆分配。这是Microsoft免费提供的一个非常好的工具。这是一个迷你教程“如何使用 Umdh.exe 查找内存泄漏”。

31赞 Dan Kegel 2/1/2010 #23

为什么不使用 Valgrind + Wine 来调试 Windows 应用呢?查看 http://wiki.winehq.org/Wine_and_Valgrind

(Chromium 使用它来检查 Windows 版本是否存在内存错误;请参阅 build.chromium.org 看看实验或记忆瀑布,寻找葡萄酒。

还有记忆博士,见 dynamorio.org/drmemory.html

评论

3赞 John Dibling 2/5/2010
因为这样你就不是在调试 Windows 应用,而是在调试 Linux 应用。
33赞 Dan Kegel 2/14/2010
无需在 Wine 中重新编译。只需将 .exe 和 .pdb 传输到 Linux 机器即可。而且你不会调试一个 Linux 应用程序;你正在调试确切的 Windows 应用。
3赞 Agnel Kurian 3/3/2010 #24

Jochen Kalmbach 的内存泄漏检测器是否合格?

PS:最新版本的 URL 隐藏在文章评论线程中的某个地方。

1赞 Ashley Davis 3/15/2010 #25

免费工具 DebugDiag 将帮助查找内存并处理泄漏。

无需设置程序即可使 DebugDiag 正常工作。

http://www.microsoft.com/downloads/details.aspx?FamilyID=28BD5941-C458-46F1-B24D-F60151D875A3&displaylang=en

虽然它不是最简单或最直观的程序!确保你在谷歌上搜索有关如何使用它的教程和说明。

2赞 Stephen Kellett 4/2/2010 #26

您列表中的另一个记忆工具:Memory Validator

不是免费的,但远不如 Purify 或 Boundschecker 贵。

3赞 Alex Budovski 4/19/2010 #27

LeakDiag、UMDH、应用验证程序、DebugDiag 都是提高代码可靠性和查找内存泄漏的有用工具。

3赞 zr. 7/2/2010 #28

Boost Test 库可以检测内存泄漏。

2赞 rogerdpack 8/9/2010 #29

如果你不害怕mingw,这里有一些链接(有些可能与MSVC一起使用)...http://betterlogic.com/roger/?p=1140

0赞 adrian 2/7/2011 #30

只是一个想法,您还可以实现内存分配器并跟踪对 malloc 和 free 的所有调用。但是,对于某些项目来说,这可能太多了。

评论

0赞 Crashworks 11/29/2011
大多数游戏都是这样做的。但这是一项艰巨的任务,需要大量的仪器。
0赞 Wayne Ariola 4/6/2011 #31

Parasoft Insure++ 一直很可靠:

http://www.parasoft.com/jsp/products/insure.jsp?itemId=63

2赞 Ira Baxter 4/6/2011 #32

我们刚刚完成了Windows的内存安全检查工具,该工具可以处理GCC和Micrsoft Visual C(还不是C++),并且正在寻找Beta测试人员。

编辑 2011 年 6 月 12 日:不再是 Beta,现在是 GCC 和 Microsoft Visual Studio C 的生产。

117赞 Lailin Chen 7/5/2011 #33

正如 jakobengblom2 所指出的,valgrind 有一套工具。根据您所说的,有不同的窗口计数器部件。我在这里只提到OSS或免费工具。

1. 内存检查:

记忆博士。这是一个相对较新的工具,在 Windows 7 上运行良好。我最喜欢的功能是它在报告中对相同的泄漏分配堆栈进行分组。

http://code.google.com/p/drmemory/

我也使用过UMDH(http://support.microsoft.com/kb/268343),发现它安静,有用且易于设置。它适用于 Win2000 到 Win7。

AppVerifier 是 Windows 原生代码开发人员必备的 swissknife,它的“内存”检查器可以 http://msdn.microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx 完成类似的工作

2. 呼叫研磨:

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

如果您需要更多功能,AMD CodeAnalyst™ 性能分析器是免费的: http://developer.amd.com/documentation/videos/pages/introductiontoamdcodeanalystperformanceanalyzer.aspx

Windows 性能分析工具是 Microsoft 免费提供的,不是很容易使用,但如果您愿意花时间,可以完成工作。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

评论

2赞 alexr 2/14/2012
还有 gperftools(以前称为 Google PerfTools)。它不是 valgrind 的替代品(实际上是什么),但它有一个新的 malloc、cpu 分析器、堆分析器和检查器。值得一看,因为它支持 Linux 和 Windows(包括 Mingw)和其他 unices。
1赞 Ricky Lung 7/21/2011 #34

您可以查看《Game Programming Gems 8》一书中的 Design and Implementation of an In-Game Memory Profiler 一文。

它演示了如何实现低开销半侵入式实时内存分析器,源代码在 CD-ROM 中提供。

enter image description here

3赞 Alexey Alexandrov 2/22/2012 #35

试试英特尔的 Inspector XE 产品,它可以帮助您检测内存和线程问题: http://software.intel.com/en-us/articles/intel-inspector-xe/

2赞 Calmarius 6/5/2012 #36

我今天发现了这个SF项目:

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

他们正在将 valgrind 移植到 Windows。可能在几年内,我们将在窗户上拥有可靠的 valgrind。

0赞 Avinash 8/9/2012 #37

在Windows上的C++应用程序中查找内存泄漏

1赞 thegreendroid 9/24/2012 #38

Clang 支持 Address Sanitizer 插件(-faddress-sanitizer 选项),它几乎可以检测 Valgrind 可以找到的大多数错误(但还不支持检测未初始化的内存读取和内存泄漏)。请参阅此页面,了解与 Valgrind 和其他类似工具的比较。官方 Windows 端口目前正在进行中,请参阅 Windows ASan 端口

几个月前,我试图在 Windows 上自己构建它并放弃了,请参阅我的相关问题。如果你想再试一次,现在情况可能会变得更好。