2017-08-17 8 views
2

私はC++ DLLを読み込むPythonアプリケーションを開発しています。そのようなDLLでは、私たちは大変な作業をしており、Googleのブレッドパッドクラッシュレポートシステムを追加したいと考えています。 Windowsでは、そのDLLがロードされると例外ハンドラをインスタンス化します。ただし、クラッシュが発生し、ミニダンプが書き込まれない場合、その例外ハンドラは決して呼び出されません。単純なC++コンソールアプリケーションで同じ設定を使用すると、すべて正常に動作します。どうやら何かが例外ハンドラがDLLにインスタンス化されたときに通知されるのを防ぎます。ブレッドパッド例外ハンドラがWIndows上のDLLで使用されていませんか?

Googleのブレッドパッド例外ハンドラがDLLで呼び出されていることを確認するにはどうすればよいですか?

以下は、私たちが使用する設定です。フレームワークは、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; 
}; 

P.S. :Breakpadハンドラは、同じ設定を持つ私たちのLinuxバージョンのアプリでうまく動作します。

ありがとうございました。

答えて

0

クラッシュとその原因は、WindowsとLinuxでは全く異なります。 Linuxのケースから始め、そのケースがうまく機能する理由を説明しましょう。

Linuxでは、シグナルハンドラを介してプログラム側でクラッシュの処理が行われます。これらはシステムのプロセス用に登録され、そのような信号がプロセスに送信されると呼び出されます。シグナルハンドラは通常のコードフローから完全に独立して実行され、同じシグナルハンドラは、プログラムでシグナルが発生した場所であればいつでも呼び出されます。 BreakpadはWindowsでは... SIGSEGV、SIGILL、のような典型的な信号のための信号を使用していないクラッシュや関連する問題の取り扱いを

をシグナルハンドラをインストールし、代わりにSEH(structured exception handling)と呼ばれる例外の特別な種類を使用しています。これらの例外は、通常のC++例外と非常によく似ていますが、通常catchの代わりに__exceptを通して捕捉されます。この通常の種類の例外処理では、クラッシュを認識するハンドラの自動クリーンアップによってオブジェクトgoogle_breakpad::ExceptionHandlerが破棄される必要があります。 Windows上のLinuxシグナルハンドラと同等の解決策はありません。 典型的なアプリケーションでは、ブレークパッドを使用してクラッシュを報告する場合は、通常、起動コードのかなり早い段階でgoogle_breakpad :: ExceptionHandlerオブジェクトを作成し、SEH未キャッチ例外 がその場所に到達したときに破棄されます。

+0

私たちはdll attach(DLLMainメソッド内)の最期のlvl ::で書き込もうとしましたが、同じ結果があります。どこでどのようにDLLコンテキストでより正確に作成しますか? – Tayliator

+0

私はすべてのSEH例外をすべてのエントリメソッドの最後でDLLに取り込み、ExceptionHandler :: WriteMinidumpForExceptionを手動で呼び出します。 – moggi

関連する問題