【问题标题】:Capturing R6025 pure virtual call捕获 R6025 纯虚拟呼叫
【发布时间】:2010-09-18 11:00:39
【问题描述】:

我目前使用 SetUnhandledExceptionFilter 捕获未处理异常的 MiniDump,但有时我会收到“R6025:纯虚函数”。

我了解纯虚函数调用是如何发生的,我只是想知道是否可以捕获它们,以便我可以在那时创建一个 MiniDump。

【问题讨论】:

    标签: c++ windows minidump dbghelp


    【解决方案1】:

    请参阅this answer here 问题where do “pure virtual function call” crashes come from?

    帮助调试这些类型的 您可以解决的问题,在各种版本中 MSVC,替换运行时库的 纯调用处理程序。你这样做 用这个提供你自己的功能 签名:

    int __cdecl _purecall(void)
    

    和 在链接运行时之前链接它 图书馆。这使您可以控制 纯调用时会发生什么 检测到。一旦你控制了你 可以做一些比 标准处理程序。我有一个处理程序 可以提供堆栈跟踪 purecall 发生在哪里;看这里: http://www.lenholgate.com/archives/000623.html 了解更多详情。

    (注意你也可以调用 _set_purecall_handler() 在某些版本中安装您的处理程序 MSVC)。

    所以,在您的 purecall 处理程序中,创建您的 minidump。

    【讨论】:

      【解决方案2】:

      如果您想捕获所有崩溃,您必须做的不仅仅是:SetUnhandledExceptionFilter

      我还将设置中止处理程序、纯调用处理程序、意外、终止和无效参数处理程序。

      #include <signal.h>
      
      inline void signal_handler(int)
      {
          terminator();
      }
      
      inline void terminator() 
      {
          int*z = 0; *z=13; 
      }
      
      inline void __cdecl invalid_parameter_handler(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t)
      {
         terminator();
      } 
      

      在你的主要放这个:

       signal(SIGABRT, signal_handler);
       _set_abort_behavior(0, _WRITE_ABORT_MSG|_CALL_REPORTFAULT);
      
       set_terminate( &terminator );
       set_unexpected( &terminator );
       _set_purecall_handler( &terminator );
       _set_invalid_parameter_handler( &invalid_parameter_handler );
      

      以上内容会将所有崩溃发送到您的未处理异常处理程序。

      【讨论】:

        【解决方案3】:

        尝试定义有问题的纯虚拟。 C++ 规则中没有任何内容禁止您定义纯虚拟,您可以出于多种原因使用它,其中最少的原因是在调用中获得回溯。唯一需要注意的是定义必须在声明之外(virtual void bla() = 0 { } 无效)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-07
          • 1970-01-01
          相关资源
          最近更新 更多