3

App AP/Invoke を介して C++ (Qt) DLL を呼び出すC# アプリケーションがありますApp B。を編集することは絶対にできないと仮定しましょう。ただし、 が からに入力を渡す前に、複製できるが正確にテストできない一連の条件下で をスローしApp Bていることはわかっています。この例外は脅威をもたらすものではなく、何らかの方法で「リセット」できる場合は無視できますが、クラッシュすると呼び出され、ランタイムが終了します。App BOut of Memory ExceptionApp AApp BApp AApp BApp Babort()App A

App Bの避けられない、予測不可能な、一般的に平凡なクラッシュが に影響を与えないようにするにはどうすればよいApp Aですか?

ノート:

  • UnhandledExceptionHandlerこのエラーがスローされると、実装された は無視されます。
  • App BApp Bサイズが大きすぎるオブジェクトを削除して null を返すことで適切に処理できる QtWebkit のバグが原因でクラッシュします。
  • App AApp Bはメモリ不足として報告されず、バグに関係なく、マシンには の操作を数回実行するのに十分なメモリがありますが、このメモリは明らかApp Bに何らかの理由で割り当てられていません。
4

2 に答える 2

3

アプリ B をロードし、何らかの IPC メカニズムを使用してアプリ A と通信することのみを目的とするシム プロセスを作成します。など)。

于 2013-02-06T19:19:10.397 に答える
1

アンマネージ コードからの SIGABRT を処理できますが、少し面倒です。完全に C# で実行できる可能性もありますが、私の方法では、それを機能させるために C++/CLI アセンブリが必要です (少なくともすべてが 1 つのプロセスで行われます)。

ステップ 1: C++/CLI クラス ライブラリ プロジェクトを作成し、*.h ファイルに次の関数を配置します。

namespace ClassLibrary1 {

    public ref class Class1
    {
    public:
        static void callaborter();
    };
}

ステップ 2: cpp ファイルに次のコードを追加します。

// This is the main DLL file.

#include "stdafx.h"
#include <csetjmp>
#include <csignal>
#include <cstdlib>
#include <iostream>
#include "ClassLibrary1.h"
#include "..\Win32Project1\Win32Project1.h"


#pragma managed(push, off) 
jmp_buf env;

void on_sigabrt (int signum)
{
    longjmp (env, 1);
}

void run()
{
    if (setjmp (env) == 0) {
            signal(SIGABRT, &on_sigabrt);
            fnWin32Project1();
    }
    else {
            std::cout << "aborted\n";
    }
}

#pragma managed(pop)

void ClassLibrary1::Class1::callaborter()
{
    run();
}

クラスライブラリとクラスの名前はデフォルトのままにしました。中止関数は call fnWinProject1() です。問題のある DLL をこのプロジェクトに直接リンクする必要があります (C++ の場合と同様)。

C# クラスに C++/CLI アセンブリへの参照を含め、「callaborter」メソッドを呼び出します。

実行中のコードは、SIGABRT (abort() によって呼び出される) のキャッチャーをセットアップし、on_sigabrt() でそれを処理します。これにより、関数全体が停止します。その後、クリーンアップして再試行できます。

OPが便利な名前を選択するための演習として残します。

注: デバッグでは、中止ダイアログが引き続き表示されます。続行するには、[無視] を押してください。リリースでは、ダイアログは表示されません。

PS私は、このstackoverflowの質問に基づいて応答を作成したことに言及する必要があります: SIGABRTシグナルを処理する方法は?

于 2013-02-06T20:25:22.937 に答える