C++ 是否有一个简单的windows内存调试器(a)是免费的(b)可以工作?

C++ 是否有一个简单的windows内存调试器(a)是免费的(b)可以工作?,c++,debugging,memory,crash,C++,Debugging,Memory,Crash,我一直试图在一个大型项目中调试一个微妙的内存问题。已经好几个星期了,我还是没能找到它。我的程序在运行一定时间后随机崩溃。因此,我一直在尝试获取某种内存调试器。以下是我考虑/尝试过的选项: IBM Purify-成功检测到内存泄漏,但要求我付钱找出它在哪里 Valgrind-我听说这个程序很好,但它是针对Linux的,我必须把我的整个项目移植过来 MPatrol——同样,它主要是针对linux的。windows版本是针对MingGW的,我使用的是Visual Studio。我在网上找到了VC++

我一直试图在一个大型项目中调试一个微妙的内存问题。已经好几个星期了,我还是没能找到它。我的程序在运行一定时间后随机崩溃。因此,我一直在尝试获取某种内存调试器。以下是我考虑/尝试过的选项:

  • IBM Purify-成功检测到内存泄漏,但要求我付钱找出它在哪里
  • Valgrind-我听说这个程序很好,但它是针对Linux的,我必须把我的整个项目移植过来
  • MPatrol——同样,它主要是针对linux的。windows版本是针对MingGW的,我使用的是Visual Studio。我在网上找到了VC++的二进制文件,并按照那里的说明操作,但程序拒绝输出任何日志文件
  • 应用程序验证程序-在开始时抛出一个随机断点,在Visual Studio中请求一个不存在的源文件(sdk.cpp),然后每次都给出此错误,无论我将其附加到哪个exe:“当前堆栈跟踪的首次访问冲突”
  • WinDbg-我甚至不知道这个程序是否达到了我认为的效果。总是给出“错误:找不到符号文件”。当我运行exe时,它似乎没有任何作用
我在谷歌上搜索了几个小时都没有找到这些错误。这些软件包的相关文档似乎没有关于我的特定问题的信息。是否有任何调试器可以工作?我真的必须把我的程序移植到Linux上吗?有人能告诉我关于内存调试的好文档的方向吗?任何帮助都将不胜感激。提前谢谢

编辑:

谢谢你的回复。我意识到崩溃问题可能不是内存泄漏。跑了一段时间后,它就冻僵了。没有错误消息。通常发生在给cout写信的时候。因此,我认为这是某种内存损坏。我想我会深入研究VisualStudio的更多功能。实际上,在使用Purify的试用版时,我发现了一些bug,但我不想花1600美元购买完整版本。最坏情况下,我将把它移植到Linux。再次感谢你的帮助

编辑2:

在使用Purify进行了更多的测试之后,我的程序似乎没有更多的内存错误。我注意到当我点击它时,程序冻结了,就像在命令提示符中一样。因此,我将假设这不是我的代码的问题,而是它与选择文本的交互方式的问题。(编辑2a:选择应该这样做facepalm)再次感谢所有的帮助


作为将来的参考,我应该去哪里学习更复杂的调试?我使用过断点和观察表达式,但在学校,它们只教授语言本身。我需要学习x86汇编吗?

我使用可视检漏仪。它检测内存泄漏,并为它们提供调用堆栈。它与VisualStudio配合使用,非常可靠。您可以从这里取下-
我不知道这是否正是您想要的,但它很有用。

不在您的列表中,非常好


编辑:深入搜索显示免费,与基于windows的系统上的传统调试器相比,它可以更简单地监视进程堆。

Visual Studio在调试版本的C库中包含内存泄漏检测。有关信息,请参阅

但是您似乎不确定崩溃是由于内存泄漏造成的。事实上,内存泄漏通常不会导致崩溃(除非崩溃是因为系统内存耗尽而发生的)。你很可能有泄漏,但这些可能与坠机无关

您是否尝试过使用VS调试器查看崩溃?很多时候,这会让你知道你面临的是什么样的问题。如果发生崩溃,我怀疑您更有可能破坏内存,例如,通过写入已分配内存块的末尾,或在释放内存块后使用内存

对如何处理内存问题有一些想法,并列出了一些免费和商用内存调试器,其中一些不在您的列表中


祝你好运。

也许Gdb和Valgrind已经移植到Windows上了


如果您的应用程序不特定于Windows,或者使用已经在Windows和Linux上移植的库(例如Qt),那么您可以考虑在Linux上调试它。

漏洞不会导致崩溃(除非是OOM相关的,我想)。内存损坏确实存在。跟踪任何内存泄漏可能会为您提供内存损坏来源的线索。。。同一个bug通常会导致这两种症状。Windk中有一些工具,例如可执行文件标记工具(用于检查页面/堆的使用等等),它们几乎是任何系统上最强大的调试器。甚至WinDbg也确实可以工作,而且是wrt功能/性能更好的产品之一(我把IDA pro放在上面,也许接下来是OllyDbg)。然而,与之合作并不容易;符号文件通常引用代码的调试符号或系统库中没有的调试符号。对于一些非调试器内存调试工具来说,仔细阅读DDK是值得的。请看,您忘了提到IBMRationalPurifyPlus的大小。对于Windows,它是201Mb。我发现它比VisualStudio本身要大。嗯,我得看看Windk。至于PursieI,只要文件有效,我不介意它的大小。如果所有其他的都失败了,你就可以开始用bug来玩捉迷藏……如果你拿出程序的一部分,看看bug是否消失了。。。如果是这样,那么错误可能在注释代码中;如果不是的话,可能是别的地方。重复此操作,直到找到错误或发疯:)他已经有了Visual Studio调试器。使用奥利有什么好处?两者都不是专门用来查找内存问题的。我已经搜索了windows Valgrind端口