【问题标题】:Catching a DLL crash in C/C++在 C/C++ 中捕获 DLL 崩溃
【发布时间】:2011-06-23 19:34:59
【问题描述】:

我正在从 DLL 中调用一个函数,如下所示:

__declspec ( dllimport ) bool dll_function(...);

int main() {
  [...]
  if (dll_function(...)) {
    [...]
  }
}

在某些情况下,我传递给 DLL 函数的数据会导致 DLL 崩溃。是否有可能捕捉到这一点,这样我的应用程序也不会崩溃(不修改不是我创建的 DLL)?

【问题讨论】:

  • dll会抛出异常吗?还是一个错误?
  • DLL 没有抛出异常,我猜它试图访问无效内存,Windows 给出了一个典型的错误对话框,之后,我的应用程序将无法继续运行。
  • @GMan:我无权访问 DLL 源,也无法修改 DLL。我只是想知道是否有一些try...catch 方法可以防止我的应用程序崩溃。
  • 在不知道函数来源的情况下几乎不可能解决这个问题。如果不是这种情况,您最好希望它有详细的文档记录,并且您可以弄清楚文档不允许您使用它做什么。
  • 如果 DLL 发生硬崩溃,那么您不不想继续尝试。你不知道它做了什么以及它在什么记忆上乱涂乱画。

标签: c++ c dll crash


【解决方案1】:

您可以在 MSVC 编译器中使用 __try 和 __except 关键字来捕获 AV。不是那么有用,你不知道造成了什么样的损害。您的程序的状态很可能已损坏。例如,堆可能被炸毁,导致随后的随机故障。将 DLL 托管在自己的进程中并使用 IPC 与其通信是唯一合适的方法。

【讨论】:

    【解决方案2】:

    在某些情况下,我传递给 DLL函数会导致崩溃 DLL。有没有可能抓住这个 所以我的应用程序不会崩溃 好吗?

    如果只调用具有有效数据的函数,是否可以防止dll崩溃?无论如何,这应该是更可取的解决方案 - 但如果不知道您要使用哪个 dll,就很难说清楚。但在大多数情况下,您应该知道究竟是什么“数据”导致了崩溃......

    【讨论】:

    • 好的,更多细节:这是我的程序 Precomp (schnaader.info/precomp.php) 我调用的函数是 PackJPG (elektronik.htw-aalen.de/packjpg) 的 JPG 重新压缩函数。有(无效的)JPG 导致 PackJPG 崩溃,为了防止这种情况发生,我必须改进我的 JPG 检测/解析,我认为这比仅仅捕获和处理崩溃要付出更多的努力(当然,如果这是可能的话)。
    【解决方案3】:

    试试看:

    http://msdn.microsoft.com/en-us/library/ms680634%28v=vs.85%29.aspx

    Oleg Starodumov (www.debuginfo.com) 的强制过滤器代码

    http://www.debuginfo.com/articles/debugfilters.html

    但是,这是顶级过滤器,而不是 try/catch。您或许可以重新启动您的流程。

    您可能需要使用 __try 处理异常。同样,解决问题或只是崩溃可能比试图抓住它更好。 我同意其他人的观点,而不是抑制或隐藏崩溃,您应该修复它。我不知道你能从崩溃中恢复到什么程度——在这样的事情之后继续执行会有用吗?

    【讨论】:

      【解决方案4】:

      我不确定这是否是问题所在,请尝试指定正确的调用约定。 (__stdcall__cdecl 等)。

      如果这不是问题,我们需要查看您传递给函数的内容,如果有的话,可能还需要查看函数代码。

      【讨论】:

      • 调用应该没问题,大多数情况下都可以,我什至有一个独立的可执行版本的 DLL 函数,它也会在无效的输入数据上崩溃。我确定我无法修复崩溃,只是想知道如何处理它。
      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多