代码之家  ›  专栏  ›  技术社区  ›  Tayliator

是否在WIndows上的DLL中未使用Breakpad异常处理程序?

  •  2
  • Tayliator  · 技术社区  · 7 年前

    我正在开发一个加载C++DLL的python应用程序。在这样的动态链接库中,我们做了所有繁重的工作,我们希望将谷歌的breakpad崩溃报告系统添加到其中。在Windows上,我们在加载DLL后实例化异常处理程序。但是,当发生崩溃时,不会调用该异常处理程序,也不会写入微转储。当我们对一个简单的C++控制台应用程序使用相同的设置时,一切都很好。显然,有什么东西阻止了异常处理程序仅在其在DLL中实例化时才被通知。

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

    #  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、 美国:Breakpad处理程序在我们的linux版本的应用程序中运行良好,该应用程序具有相同的设置。

    谢谢你的帮助。

    1 回复  |  直到 7 年前
        1
  •  2
  •   moggi    7 年前

    在Linux上,崩溃的处理是通过信号处理程序在程序端完成的。这些是为您的进程在系统中注册的,一旦这样的信号发送到您的进程,就会调用它们。信号处理程序的运行完全独立于您的正常代码流,并且无论信号在您的程序中起源于何处,都将调用相同的信号处理程序。 Breakpad为SIGSEGV、SIGILL等典型信号安装信号处理程序。。。

    structured exception handling ). 这些异常的工作方式与正常的C++异常非常相似,但通常是通过_u捕获的,而不是通过catch。这种正常的异常处理需要 google_breakpad::ExceptionHandler 在一个典型的应用程序中,如果你想通过breakpad报告崩溃,你通常会在启动代码的早期创建google\u breakpad::ExceptionHandler对象,这样当出现SEH未捕获异常时,它就会被破坏