【问题标题】:Howto prevent process crash on CRT error C++如何防止 CRT 错误 C++ 导致进程崩溃
【发布时间】:2012-05-23 12:10:39
【问题描述】:

我有一个第 3 方 C 库,它会因 CRT 错误而崩溃。在这种情况下,整个过程会崩溃。有什么方法可以捕获所有 CRT 错误并防止进程终止。

【问题讨论】:

  • 检查您使用的库函数的输入。检查库状态((每线程)初始化?)。如果一切顺利,请向库供应商提交错误。
  • 可能不会。 __TRY 如果您使用的是 Windows 或 Unix 上的信号,则可能会起作用,具体取决于确切的例外情况。这是什么?
  • msdn.microsoft.com/en-us/library/969zc1ac.aspx 看起来你是 SOL(倒数第二个函数,做不到)。
  • 当您以递归方式或从多个线程调用不可重入和非线程安全函数时,库通常会崩溃。确保你没有违反一些不太明显的规则。
  • 我尝试了 __try 选项,但没有帮助。

标签: c++ exception-handling crt


【解决方案1】:

防止崩溃可能只是延迟问题。

假设您可以防止崩溃,但结果是用户将不正确的数据保存回数据库,或损坏数据文件,那么您只会让问题变得更糟。

相反,尝试找出确切的问题是什么:

  • 您是否向 3rd 方库中的函数传递了不正确的参数?
  • 还是第三方库中的错误?让图书馆制造商解决这个问题。

或者:

  • 尝试找到解决问题的方法
  • 为图书馆寻找替代品

编辑: 老实说,我去年在使用 3rd 方组件时遇到了同样的情况。我所做的如下:

首先,使用 _try/_except 构造来解决问题。这仅在您知道它在哪个函数调用中完全崩溃时才有效。它的工作原理是这样的:

__try
   {
   Some3rdPartyLibraryFunction();
   }
__except (EXCEPTION_EXECUTE_HANDLER)
   {
   }

其次,为防止您的应用程序进一步损坏,请确保您的应用程序中不再调用第三方库。例如。假设这个库是一个报表组件,那么如果遇到崩溃,就不要再让用户打开报表了,像这样:

bool MyClass::openReport (char *reportname)
   {
   if (!reportModuleEnabled)
      return false;

   __try
      {
      OpenTheReport(reportname);
      }
   __except (EXCEPTION_EXECUTE_HANDLER)
      {
      // Tell the user about the problem and prevent further access to the library
      ShowMessage ("Sorry, no more reports");
      reportModuleEnabled = false;
      return false;
      }
   return true;
   }

【讨论】:

  • 如果有什么你应该尝试更快地崩溃。
  • _try 没有帮助。该库进行文本解析,并通过用户输入调用。它粉碎了一些文本,但我对此无能为力。我想要的是向用户显示一些消息并关闭线程,而不是整个服务器进程崩溃
  • 您在编译器的命令行中指定了哪种异常处理机制?我使用 /EHsc,这在我的情况下似乎可以正常工作。
【解决方案2】:

您的程序在 Windows 上运行?你试过用 SEH 包装有问题的代码吗? http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657(v=vs.85).aspx

【讨论】:

  • 是的,我尝试添加未处理的异常过滤器,并重定向异常,但都没有成功
【解决方案3】:

真可惜,没有人明白这一点。 CRT 错误与 SEH 无关,因此_try..._except 无法捕获它。 您应该使用 _set_invalid_parameter_handler 和 _set_purecall_handler 函数来处理 CRT 错误。

http://crashrpt.sourceforge.net/docs/html/exception_handling.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2017-07-28
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多