是否在WIndows上的DLL中未使用Breakpad异常处理程序? 我正在研究一个装载C++的DLL的Python应用程序。在这样的DLL中,我们完成了所有繁重的工作,我们希望将Google的breakpad崩溃报告系统添加到其中。在Windows上,加载DLL后,我们将实例化异常处理程序。但是,当崩溃发生时,不会调用该异常处理程序,也不会写入迷你转储。当我们为一个简单的C++控制台应用程序使用相同的设置时,一切都很好。显然,有些东西阻止了异常处理程序仅在它在DLL中实例化时才被通知

是否在WIndows上的DLL中未使用Breakpad异常处理程序? 我正在研究一个装载C++的DLL的Python应用程序。在这样的DLL中,我们完成了所有繁重的工作,我们希望将Google的breakpad崩溃报告系统添加到其中。在Windows上,加载DLL后,我们将实例化异常处理程序。但是,当崩溃发生时,不会调用该异常处理程序,也不会写入迷你转储。当我们为一个简单的C++控制台应用程序使用相同的设置时,一切都很好。显然,有些东西阻止了异常处理程序仅在它在DLL中实例化时才被通知,c++,windows,dll,crash-reports,google-breakpad,C++,Windows,Dll,Crash Reports,Google Breakpad,如何确保在DLL中调用Google的breakpad异常处理程序 下面是我们使用的设置。框架是在我们开始使用DLL之前创建的单例 # include <client/windows/handler/exception_handler.h> bool callback( const wchar_t* /*dump_path*/, const wchar_t* /*minidump_id*/, void* /*context*/, EXCEPTION_POINTERS* /

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

下面是我们使用的设置。框架是在我们开始使用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;
};
#包括
布尔回调(
常量wchar\u t*/*转储路径*/,常量wchar\u t*/*小型转储id*/,
void*/*context*/,EXCEPTION\u指针*/*exinfo*/,MDRawAssertionInfo*/*断言*/,
布尔(成功)
{

std::cout崩溃及其原因在Windows和Linux上的处理方式完全不同。让我们从Linux案例开始,解释为什么该案例能够成功运行

在Linux上,崩溃的处理是通过信号处理程序在程序端完成的。这些程序在系统中为您的进程注册,并在此类信号发送到您的进程后调用。信号处理程序的运行完全独立于您的正常代码流,并且无论信号在哪里或在哪里,都将调用相同的信号处理程序在你的程序中有原创者。 Breakpad为典型信号(如SIGSEGV、SIGILL等)安装信号处理程序

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

在dll附加期间(在DLLMain方法中),我们尝试在最早的lvl::期间编写但它有相同的结果。在DLL上下文中,您将在何处以及如何更精确地创建它?我将捕获DLL中每个输入方法末尾的所有SEH异常,并手动调用ExceptionHandler::WriteMinidumpforeException。