【问题标题】:Track Data Execution Prevention (DEP)跟踪数据执行保护 (DEP)
【发布时间】:2008-09-26 14:21:12
【问题描述】:

在运行我们的一款软件时,测试人员遇到了 Windows 的数据执行保护对话框。

我们尝试在开发人员计算机上重现这种情况以进行调试:没有成功。

有谁知道如何找到可能导致 DEP 保护终止应用程序的原因? 是否有任何现成的工具可用于此?

【问题讨论】:

    标签: c++ dep


    【解决方案1】:

    DEP 对话框通常只会在您尝试从未标记为可执行的区域执行代码时显示。这可能是由您正在使用的库中的“thunk”引起的,例如ATL 窗口化。此问题已在 ATL 8.0 中修复。

    堆栈垃圾错误(例如缓冲区溢出)也可能导致此问题,方法是将返回地址设置为不可执行的位置。如果 DEP 为进程关闭或在硬件上不可用,这可能不会导致访问冲突,而是会导致奇怪的行为。

    如果您抛出 C++ 异常或引发 SEH 异常,并且您的结构化异常处理程序已被缓冲区溢出丢弃,也可能发生这种情况。

    【讨论】:

      【解决方案2】:

      我可能认为,任何时候您尝试写入未分配的内存时,这都是可能的结果。可以是删除一个对象然后使用它,或者将一个字符串写入一个太小而无法容纳它的缓冲区。

      【讨论】:

      • 我知道 DEP 可以杀死我的应用程序的所有原因。问题是该应用程序持有 10 年,包含大量代码和库。 “手动”查找可能的原因有点问题。
      • 一旦错误被清除,如果您没有堆栈转储或非常冗长的日志记录,那么您几乎就是 SOL。当这些问题不容易重现时,追踪并修复这些问题就在停止问题中。
      【解决方案3】:

      DEP 受硬件功能的影响。我们最近遇到了一种情况,我们的应用程序在旧机器上运行良好,但在新机器上会失败。事实证明,尽管在旧服务器和新服务器上都启用了 DEP,但我们在新服务器上崩溃了,因为硬件检测更好、更激进或类似的东西。因此,如果您的 QA 可以重现,但 DEV 不能,那么请尝试使用相同的硬件... 以下是我对我们最近在这方面的经验的笔记: Incompatibilities between Indy 9 and Windows Server 2003?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多