/ MT和/ MD会造成崩溃,但只有当调试器未连接时:如何调试?

这个问题在这里已经有了答案:

  • 程序只发布崩溃作为发布版本 - 如何调试? 26个答案

  • 有一点与运行调试器有所不同的是操作系统调试堆(另请参阅为什么我的代码在连接调试器时运行缓慢?)。 您可以使用环境变量_NO_DEBUG_HEAP关闭调试堆。 您可以在计算机属性中或在Visual Studio中的“项目设置”中指定它。

    一旦关闭调试堆,即使连接了调试器,也应该看到相同的崩溃。

    也就是说,要知道内存损坏可能很难调试,因为经常发生损坏的真正原因(如某些缓冲区溢出)可能与您看到症状(崩溃)的位置相距甚远。


    new或malloc内部的崩溃通常暗示着malloc实现的(内部)结构已被破坏。 这大部分时间都是通过写入前一个分​​配(缓冲区溢出)完成的。 然后在下一次调用new或malloc时,应用程序崩溃,因为内部结构现在包含无效数据。

    检查是否可以覆盖之前分配的空间。

    如果你的应用程序是可移植的,你可以尝试在Linux上构建它并在Valgrind下运行它。


    应用程序验证程序对于解决这个问题非常有用 - 在环境中_NO_DEBUG_HEAP = 1时,请参阅此处接受的答案:查找上次释放内存的位置?

    也许值得一提的是pageheap,这是我在查看Application Verifier时发现的。 看起来它包含了一些类似的基础。

    (仅供参考,它是一个字符的缓冲区溢出:

    m_pEnumName = (char*)malloc(strlen(data) /* missing +1 here */);
    strcpy(m_pEnumName, data);
    

    ......不是直接使用strcpy另一个可笑的好论据。)

    链接地址: http://www.djcxy.com/p/14439.html

    上一篇: /MT and /MD builds crashing, but only when debugger isn't attached: how to debug?

    下一篇: Dependency Injection / LoD