gpt4 book ai didi

c++ - 如何构建捕获所有异常的 C++ Dll 包装器?

转载 作者:IT老高 更新时间:2023-10-28 21:35:14 43 4
gpt4 key购买 nike

正如标题所说,我们正在寻找一种方法来捕获一段 C++ 代码中的所有异常,并将其包装在一个 dll 中。这样我们就可以屏蔽使用这个 dll 的应用程序,使其免受这个 dll 中发生的任何错误。

但是,这在 Windows 下使用 C++ 似乎是不可能的。

例子:

void function()
{
try
{
std::list<int>::iterator fd_it;
fd_it++;
} catch(...) {}
}

发生的异常不会被标准 C++ try/catch block 捕获,也不会被 _set_se_translator() 设置的任何 SEH 转换器函数捕获。相反,DLL 崩溃,并且使用 DLL 的程序被中止。我们使用 Visual C++ 2005 编译,带有选项/SHa。有谁知道在 C++/Win32 中是否有可能捕捉到这些问题并制作一个坚如磐石的 DLL 包装器?

最佳答案

制作坚如磐石的 DLL 包装器的唯一方法是将有缺陷的 DLL 加载到另一个进程中,这样如果它崩溃,它就不会导致您的主进程随之瘫痪。

捕获所有 C++ 异常似乎是合理的,但捕获所有结构化异常是另一回事。 SEH 可能似乎可以帮助您完成大部分工作,因为它允许您捕获访问冲突、被零除异常等。

但是,如果有缺陷的 DLL 碰巧触及了另一个线程堆栈中未提交的页面怎么办?内存访问将出现页面错误,将调用异常处理程序,现在该页面不再是保护页面。当该线程需要增加堆栈时,它将发生访问冲突,并且进程将崩溃。 (These posts 更详细地描述这个案例。)

另一个可能的问题:有缺陷的 DLL 在持有同步对象时崩溃,但您使用 SEH 来捕获异常。如果您的进程尝试获取相同的同步对象,那么它会死锁而不是崩溃。共享的同步对象可能是 C 运行时或操作系统的一部分:如果有缺陷的 DLL 1 加载有缺陷的 DLL 2,它在其 DllMain() 中崩溃,而有缺陷的 DLL 1 持有加载程序锁怎么办?下次加载 DLL 时,您的进程会死锁吗?

关于为什么这个(以及像 IsBadReadPtr() 之类的函数有类似问题)是 SEH 滥用的更多信息:

关于c++ - 如何构建捕获所有异常的 C++ Dll 包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/541235/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com