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