0

在我们的应用程序 (c++) 中,我们使用 LoadLibrary 加载第 3 方 DLL。有时这些 DLL 会导致异常,例如“访问冲突读取位置 0x00000000..”。

是否可以从这种异常中恢复,例如使用 try & catch 或其他机制?在其他世界中,是否有可能在同一进程中创建一个沙箱来承受此类事件?

谢谢

4

6 回答 6

4

不,这不对。DLL 可以不受限制地访问调用它的进程上下文。您需要在它们自己的进程上下文中运行不可信的 DLL。

于 2012-03-29T09:32:32.340 回答
2

在 Windows 中,使用 VisualStudio 编译器,可能会使用SEH机制。

__try
{
  char* ptr = 0;
  char val = *ptr;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
{
  std::cout<<"AV"<<std::endl;
}

使用选项/EHa

于 2012-03-29T09:53:15.780 回答
1

如果在 c++ 中不可能再抛出跨模块异常,那么在任何情况下您的应用程序中都会出现内存损坏,因此您必须找出 dll 中出了什么问题。您可以在此处检查无法从 dll 抛出异常的原因:http: //www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL

于 2012-03-29T09:40:04.277 回答
1

您可以在 Visual Studio 中尝试使用/EH标志 - http://msdn.microsoft.com/en-us/library/1deeycx5%28v=vs.80%29.aspx,但访问冲突异常很可能意味着您正在做某事非常错误。我会让程序崩溃并尝试解决异常,而不是捕获它。

于 2012-03-29T09:32:37.530 回答
1

Runtime-Compiled C++ 背后的人正在为他们的 DLL 崩溃处理例程使用一种称为结构化异常处理的东西。深入他们的网站或询问他们是否需要一些代码示例。

根据 MSDN,该/EHa开关启用“具有结构化异常处理异常的 C++ 异常处理”。因此,如果您使用的是msvc编译器,您可能想尝试一下。

于 2012-03-29T10:00:12.950 回答
1

您可以尝试不同类型的异常处理程序:

__try
{
    // Code that might cause an access violation goes here. 

}
__except (EXCEPTION_EXECUTE_HANDLER)
{
    int code = _exception_code();

}

但请注意,此类处理程序不能在 C++ 对象需要堆栈展开的任何例程中使用,因为编译器会警告您(令人恼火)。

于 2012-03-29T09:34:53.507 回答