在运行我们的一款软件时,测试人员遇到了 Windows 的数据执行保护对话框。
我们尝试在开发人员计算机上重现这种情况以进行调试:没有成功。
有谁知道如何找到可能导致 DEP 保护终止应用程序的原因?是否有任何现有的工具可用于此?
DEP 对话框通常只会在您尝试从未标记为可执行的区域执行代码时显示。这可能是由您正在使用的库中的“thunk”引起的,例如 ATL 窗口。此问题已在 ATL 8.0 中修复。
堆栈垃圾错误(例如,缓冲区溢出)也可能导致此问题,方法是将返回地址设置为不可执行的位置。如果 DEP 为进程关闭或在硬件上不可用,这可能不会导致访问冲突,而是会导致奇怪的行为。
如果您抛出 C++ 异常或引发 SEH 异常,并且您的结构化异常处理程序已被缓冲区溢出丢弃,也可能会发生这种情况。
我可能会认为,任何时候您尝试写入未分配的内存都是可能的结果。可以是删除一个对象然后使用它,或者将一个字符串写入一个太小而无法容纳它的缓冲区。
DEP 受硬件能力的影响。我们最近遇到了一种情况,我们的应用程序在旧机器上运行良好,但在新机器上会失败。事实证明,尽管在旧服务器和新服务器上都启用了 DEP,但我们在新服务器上崩溃了,因为硬件检测更好、更激进或类似的东西。因此,如果您的 QA 可以重现但 DEV 不能,那么请尝试使用相同的硬件……尽管 QA 拥有比开发人员更新/更好的 PC 似乎是不合理的……我完全相信!
以下是我对我们最近的经验的注释:
Indy 9 和 Windows Server 2003 之间的不兼容性?