【问题标题】:How to find heap corruption in my DLL with Application Verifier?如何使用 Application Verifier 在我的 DLL 中查找堆损坏?
【发布时间】:2019-07-20 22:49:51
【问题描述】:

我使用 Visual Studio 2017 开发了一个 C++ DLL,但我遇到了一些内存问题。我想使用Application Verifier 对其进行调试,但运行我的 DLL(第三方应用程序)的应用程序也被堆损坏。因此,如果我激活应用程序验证程序,应用程序会在我的 DLL 加载之前崩溃。

是否可以告诉应用程序验证程序只处理 DLL 或模块的堆损坏?如果没有,有没有办法用其他工具调试我的 DLL?

【问题讨论】:

    标签: visual-c++ dll application-verifier


    【解决方案1】:

    为什么不编写一个简单的包装应用程序?我不得不为导致堆损坏的第三方 DLL 执行此操作,从而导致我们的应用程序崩溃。在这种情况下,它在析构函数中,所以我只需要加载和释放它。但是,如果您没有找到它,您可以为每个导出添加单元测试。

    【讨论】:

    • 是的,这可能是个好主意。但我忘了提到 DLL 和宿主应用程序之间存在紧密耦合。
    【解决方案2】:

    据我所知,应用程序验证程序使用全局窗口标志来检测泄漏和堆损坏。所以你可以直接使用 gflags 工具来启用这个功能。

    请查看 Microsoft How to use gflags for finding heap corruptions 的以下讨论。

    【讨论】:

    • 我同意这一点,但我可以只为 DLL 激活 gflags(或 Application Verifier)吗?因为,当我使用 gflags/Application Verifier 时,我的应用程序在加载我的 DLL 之前崩溃,因为第三方应用程序也已损坏,我无法对其进行编辑。
    • 据我所知 udmh 应该能够验证您的应用程序的所有堆:docs.microsoft.com/en-us/windows-hardware/drivers/debugger/… 希望有帮助。
    • 我刚刚修复了发布的链接,现在转到如何使用它调试堆损坏的教程。顺便说一句,您也可以在调试器中运行该应用程序以找到解决方案。
    • @Pierre 如果第三方应用程序由于 appverif 页面堆而崩溃,我认为您可以指定仅将页面堆用于您的 DLL。右键单击堆并在 Dlls 文本框中输入您的 Dll。如果它无论如何都崩溃了,那么我认为你不走运。
    • 提供的网址无效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多