在WIndows上的DLL中没有使用Breakpad异常处理程序?

时间:2017-08-17 10:52:15

标签: c++ windows dll crash-reports google-breakpad

我正在开发一个加载C ++ DLL的python应用程序。在这样的DLL中,我们做了所有繁重的工作,我们想要将Google的breakpad崩溃报告系统添加到其中。在Windows上,我们在加载DLL后实例化一个异常处理程序。但是,当发生崩溃并且从不写入minidump时,永远不会调用该异常处理程序。当我们对简单的C ++控制台应用程序使用相同的设置时,一切正常。显然有些事情会阻止异常处理程序仅在DLL中实例化时才被通知。

我们如何确保在DLL中调用Google的破解异常处理程序?

以下是我们使用的设置。 Framework是在我们开始使用DLL之前创建的单例。

#  include <client/windows/handler/exception_handler.h>

bool callback(
  const wchar_t* /*dump_path*/, const wchar_t* /*minidump_id*/, 
  void* /*context*/, EXCEPTION_POINTERS* /*exinfo*/,  MDRawAssertionInfo* /*assertion*/,
  bool succeeded )
{
  std::cout << "dump callback called" << std::endl;
  return succeeded;
}

class Framework
{
  Framework()
    : handler{ std::make_unique<google_breakpad::ExceptionHandler>(  
        L".",       // dump path
        nullptr,    // no filter
        callback,   // to call after writing the minidump
        nullptr,    // callback does not use context
        google_breakpad::ExceptionHandler::HANDLER_ALL ) }
  {
    std::cout << "Exception handler registered" << std::endl;
  }

  ~Framework()
  {
    std::cout << "Exception handler destroyed" << std::endl;
  }  

private:
  std::unique_ptr<google_breakpad::ExceptionHandler> handler;
};

P.S。 :Breakpad处理程序在我们的linux版本的应用程序中工作正常,具有相同的设置。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

崩溃及其原因在Windows和Linux上完全不同。让我们从Linux案例开始,解释为什么这个案例成功运作。

在Linux上,崩溃的处理是通过信号处理程序在程序端完成的。这些是在系统中注册的过程,一旦这样的信号发送到您的过程就会被调用。信号处理程序完全独立于正常的代码流运行,并且只要信号源自程序,就会调用相同的信号处理程序。 Breakpad为典型信号安装信号处理程序,如SIGSEGV,SIGILL,......

在Windows上,崩溃和相关问题的处理不是使用信号,而是使用一种称为SEH(structured exception handling)的特殊异常。这些异常与普通的C ++异常非常相似,但通常通过__except而不是catch来捕获。这种正常的异常处理要求您的google_breakpad::ExceptionHandler对象被识别崩溃的处理程序的自动清理破坏。 Windows上的Linux信号处理程序没有等效的解决方案。 在典型的应用程序中,如果要通过breakpad报告崩溃,通常会在启动代码的早期创建google_breakpad :: ExceptionHandler对象,以便在SEH未捕获的异常时将其销毁 到达那个地方。