在我们的应用程序 (c++) 中,我们使用 LoadLibrary 加载第 3 方 DLL。有时这些 DLL 会导致异常,例如“访问冲突读取位置 0x00000000..”。
是否可以从这种异常中恢复,例如使用 try & catch 或其他机制?在其他世界中,是否有可能在同一进程中创建一个沙箱来承受此类事件?
谢谢
在我们的应用程序 (c++) 中,我们使用 LoadLibrary 加载第 3 方 DLL。有时这些 DLL 会导致异常,例如“访问冲突读取位置 0x00000000..”。
是否可以从这种异常中恢复,例如使用 try & catch 或其他机制?在其他世界中,是否有可能在同一进程中创建一个沙箱来承受此类事件?
谢谢
不,这不对。DLL 可以不受限制地访问调用它的进程上下文。您需要在它们自己的进程上下文中运行不可信的 DLL。
在 Windows 中,使用 VisualStudio 编译器,可能会使用SEH机制。
__try
{
char* ptr = 0;
char val = *ptr;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
{
std::cout<<"AV"<<std::endl;
}
使用选项/EHa。
如果在 c++ 中不可能再抛出跨模块异常,那么在任何情况下您的应用程序中都会出现内存损坏,因此您必须找出 dll 中出了什么问题。您可以在此处检查无法从 dll 抛出异常的原因:http: //www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL
您可以在 Visual Studio 中尝试使用/EH
标志 - http://msdn.microsoft.com/en-us/library/1deeycx5%28v=vs.80%29.aspx,但访问冲突异常很可能意味着您正在做某事非常错误。我会让程序崩溃并尝试解决异常,而不是捕获它。
Runtime-Compiled C++ 背后的人正在为他们的 DLL 崩溃处理例程使用一种称为结构化异常处理的东西。深入他们的网站或询问他们是否需要一些代码示例。
根据 MSDN,该/EHa
开关启用“具有结构化异常处理异常的 C++ 异常处理”。因此,如果您使用的是msvc
编译器,您可能想尝试一下。
您可以尝试不同类型的异常处理程序:
__try
{
// Code that might cause an access violation goes here.
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
int code = _exception_code();
}
但请注意,此类处理程序不能在 C++ 对象需要堆栈展开的任何例程中使用,因为编译器会警告您(令人恼火)。