簡體   English   中英

捕獲R6025純虛擬呼叫

[英]Capturing R6025 pure virtual call

我目前使用SetUnhandledExceptionFilter捕獲未處理異常的MiniDumps,但有時我得到“R6025:純虛函數”。

我理解一個純虛函數調用是如何發生的我只是想知道是否有可能捕獲它們所以我可以在那時創建一個MiniDump。

如果你想捕獲所有崩潰,你必須做的不僅僅是:SetUnhandledExceptionFilter

我還將設置中止處理程序,purecall處理程序,意外,終止和無效參數處理程序。

#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 );

以上將發送所有崩潰到您未處理的異常處理程序。

在這里看到這個答案的問題“純虛函數調用”崩潰來自何處?

為了幫助調試這些類型的問題,您可以在各種版本的MSVC中替換運行時庫的purecall處理程序。 您可以通過使用此簽名提供自己的功能來執行此操作:

int __cdecl _purecall(void)

並在鏈接運行時庫之前鏈接它。 這使您可以控制檢測到純調用時發生的情況。 一旦掌握了控制權,就可以做一些比標准處理程序更有用的事情。 我有一個處理程序,可以提供purecall發生位置的堆棧跟蹤; 請參閱: http//www.lenholgate.com/archives/000623.html了解更多詳情。

(注意,您也可以調用_set_purecall_handler()在某些版本的MSVC中安裝處理程序)。

所以,在你的purecall處理程序中,制作你的minidump。

嘗試定義違規的純虛擬。 C ++規則中沒有任何內容禁止您定義純虛擬,並且您可以出於多種原因使用它,其中最少的是在調用中獲得回溯。 唯一的caviat是定義必須在聲明之外( virtual void bla() = 0 { }無效)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM