15

現在、未処理の例外の MiniDumps をキャプチャしてSetUnhandledExceptionFilterいますが、「R6025: pure virtual function」というメッセージが表示されることがあります。

純粋な仮想関数呼び出しがどのように発生するかを理解しています。それらをキャプチャして、その時点で MiniDump を作成できるかどうか疑問に思っています。

4

3 に答える 3

18

すべてのクラッシュをキャッチしたい場合は、次のこと以外のことを行う必要があります。

また、アボート ハンドラー、purecall ハンドラー、unexpected、terminate、および無効なパラメーター ハンドラーも設定します。

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

上記は、すべてのクラッシュを未処理の例外ハンドラーに送信します。

于 2008-10-22T01:38:42.537 に答える
12

「純粋仮想関数呼び出し」のクラッシュはどこから発生するのかという質問に対するこの回答を参照してください。.

この種の問題のデバッグを支援するために、MSVC のさまざまなバージョンで、ランタイム ライブラリの purecall ハンドラを置き換えることができます。これを行うには、独自の関数にこのシグネチャを提供します。

int __cdecl _purecall(void)

ランタイム ライブラリをリンクする前にリンクします。これにより、ピュアコールが検出されたときに何が起こるかを制御できます。制御できるようになると、標準のハンドラーよりも便利なことを行うことができます。purecall が発生した場所のスタック トレースを提供できるハンドラーがあります。詳細については、http: //www.lenholgate.com/archives/000623.html を参照してください。

_set_purecall_handler()( MSVC の一部のバージョンでは、呼び出してハンドラーをインストールすることもでき ます)。

したがって、purecall ハンドラーで、ミニダンプを作成します。

于 2008-10-22T01:38:41.337 に答える
-2

問題のある純粋な仮想を定義してみてください。C++ の規則では、純粋な仮想を定義することを禁止するものは何もありません。これはさまざまな理由で使用できますが、呼び出しでバックトレースを取得することが最も少ない理由です。唯一の注意点は、定義が宣言の外にある必要があることです (virtual void bla() = 0 { }は無効です)。

于 2008-10-22T01:40:16.933 に答える