我正在寻找Valgrind来帮助提高我的C编码/调试,当我发现它只适用于Linux时——我没有其他需要或兴趣将我的操作系统转移到Linux,所以我想知道是否有同样好的Windows程序。
我曾经有机会使用Compuware DevPartner Studio,那真的很好,但它相当昂贵。 一个更便宜的解决方案可以是GlowCode,我刚刚与一个5。X版本,尽管在附加到我需要调试的进程时出现了一些问题,但它运行得很好。
请参阅软件QA测试和测试工具资源页面上的“源测试工具”链接,以获得类似工具的列表。
我曾经使用BoundsChecker,DevPartner Studio和Intel V-Tune进行分析。我最喜欢V-Tune;你可以模拟各种英特尔芯片组,它会给你关于如何优化该平台的提示。
Windows的调试工具中有Pageheap.exe部分。它是免费的,基本上是一个自定义的内存分配器/释放器。
参见http://support.microsoft.com/kb/286470
对于Visual c++,请尝试Visual Leak Detector。当我使用它时,它从一个新调用中检测到内存泄漏,并返回泄漏源代码中的实际行。最新版本可以在http://vld.codeplex.com/上找到。
绝对净化!我用它来分析一些大型代码库(>3,000 kSLOC),发现它非常出色。
你可能想在维基百科上看看这个列表。
顺便说一下,我发现memwatch很有用。谢谢约翰!
Viusual Studio本身可以帮助检测内存泄漏。参见Microsoft Visual c++技巧->“内存泄漏”部分。 参见《SO》中的这篇文章
虽然真正的跟踪只能与Visual Studio的团队版。
所有分析器或多或少都包括检查内存泄漏,并在分配内存时显示堆栈。
我可以推荐英特尔并行检查器。使用简单,不需要重新编译。试运行期为30天。
GlowCode和AtromatedQA也包含这样的功能。他们都提供免费试用。
Compuware DevPartner(又名BoundsChecker)在对比中需要慢速的“仪器”重新编译,应用程序在检查错误时也会运行得更慢。和BoundsChecker不能工作与64位evsrions在所有。我们放弃了那个工具。
我使用了Insure++,它在查找c++内存泄漏/损坏和许多其他错误,如未初始化的变量,指针错误,字符串等方面做得很好,它还做了可视化的“代码覆盖”和运行时内存使用等。这让你对你的代码更有信心。你可以尝试一下试用版。
在与Visual Studio结合使用时,我通常使用Visual Leak Detector或简单地使用_CrtDumpMemoryLeaks(),这是一个win32 api调用。两者都不花哨,但都能完成任务。
您可以尝试RuntimeChecker试用版或者IBM Purify试用版。
一个免费的解决方案是在Visual Studio中使用以下代码:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
只要把这个写在所有cpp文件的顶部。 这将在停止调试运行时检测应用程序的内存泄漏,并在输出窗口中列出它们。双击内存泄漏行将突出显示已分配内存且从未释放内存的行。这可能对你有帮助:http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml
我想列举一些工具,希望对大家有用
阅读这篇文章了解更多细节
净化 边界检查 Coverity(基本上它是一个代码分析器,但它会捕捉静态内存泄漏) 发光的代码 dmalloc ccmalloc NJAMD YAMD Valgrind mpatrol 确保+ +
用户模式转储堆(UMDH)实用程序与操作系统一起工作,分析特定进程的Windows堆分配。这是微软提供的一个很好的免费工具。这是一个小教程“如何使用Umdh.exe来查找内存泄漏”。
为什么不用Valgrind + Wine来调试你的Windows应用程序呢?看到 http://wiki.winehq.org/Wine_and_Valgrind
(Chromium使用这个来检查Windows版本的内存错误;看到 build.chromium.org 看看实验瀑布或记忆瀑布,寻找葡萄酒。)
还有记忆博士 dynamorio.org/drmemory.html
免费工具DebugDiag将帮助查找内存并处理内存泄漏。
为了使DebugDiag工作,您不需要对程序进行配置。
http://www.microsoft.com/downloads/details.aspx?FamilyID=28BD5941-C458-46F1-B24D-F60151D875A3&displaylang=en
虽然它不是最简单或最直观的程序使用!确保你谷歌的教程和说明如何使用它。
Parasoft insur++一直是可靠的:
http://www.parasoft.com/jsp/products/insure.jsp?itemId=63
我们正在完成一个用于Windows的内存安全检查工具,它可以处理GCC和microsoft Visual C(还不是c++),正在寻找Beta测试人员。
2011年6月12日:不再是Beta版,现在是GCC和Microsoft Visual Studio C的产品版。
正如jakobengbloom2所指出的,valgrind有一套工具。根据你谈论的是哪一个,有不同的窗口柜台部分。这里我只提到OSS或免费工具。
1. MemCheck:
博士的记忆。这是一个相对较新的工具,在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. Callgrind:
我最喜欢的是verysley (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上的免费工具有:
VMMap来自sysinternals: 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
你可以参考《Game Programming Gems 8》中的文章《游戏内内存分析器的设计与实现》。
它展示了如何实现一个低开销的半侵入式实时内存分析器,源代码在CD-ROM中提供。
试试Intel的Inspector XE产品,它可以帮助您检测内存和线程问题:http://software.intel.com/en-us/articles/intel-inspector-xe/
我今天发现了这个SF项目:
http://sourceforge.net/p/valgrind4win/wiki/Home/
他们正在将valgrind移植到Windows。也许几年后,我们的窗户就会有可靠的耐磨材料了。
Clang支持地址消毒插件(-faddress-sanitizer选项),它几乎可以检测到Valgrind可以发现的大多数错误(不支持检测未初始化的内存读取和内存泄漏)。请参阅本页与Valgrind和其他类似工具的比较。一个正式的Windows端口目前正在进行中,请参阅Windows ASan端口。
几个月前,我尝试自己在Windows上构建它,但放弃了,请看我的相关问题。如果你想再试一次,事情可能已经变得更好了。
推荐文章
- C“int”的大小是2字节还是4字节?
- 多维数组如何在内存中格式化?
- printf()和puts()在C语言中的区别是什么?
- 断言是邪恶的吗?
- 如何运行一个PowerShell脚本而不显示窗口?
- PowerShell:仅为单个命令设置环境变量
- 有效,但毫无价值的语法在开关情况下?
- 为什么这个Windows批处理文件只执行第一行,而在命令shell中执行所有三行?
- 如何在Visual Studio中找到堆栈跟踪?
- 环境变量存储在Windows注册表的哪里?
- 有一个好的Valgrind Windows的替代品吗?
- gcc在哪里查找C和c++头文件?
- Windows和Linux上的c++编译:ifdef开关
- Eclipse调试器总是阻塞在ThreadPoolExecutor上,没有任何明显的异常,为什么?
- 如何验证批处理文件中是否存在一个文件?