2016-06-16 9 views
1

私はAndroidベースのアプリケーションでfirebaseを動作させようとしていますが、主にC++コードです。 クラッシュがあると、C++部分に何らかの悪いアクセスがある可能性があります。 Firebaseは捕捉されていないjava例外とうまく動作しますが、JNIシグナル/例外で動作するようにはできません。 CでAndroid JNIシグナル/例外の後にレポートを送信

Somewehre ++、我々はそれが送信されます対処したい信号のためのシグナルハンドラを追加します。私の知る限り、それはまだJNIと互換性がありません知っているが、私はこの問題を回避するには、これに似たものになるだろうと思ったよう

Java側に戻り、可能であればスタックトレースの一部を使用してレポートを送信しようとします。

#include <cisgnal> 
namespace 
{ 
    void SignalHandler(int sig) 
    { 
     // Code to call a static method in my Activity 
    } 
} 

CrashReporter::CrashReporter() 
{ 
    ::signal(SIGABRT, & ::SignalHandler) 
} 

// In java 
public static void SendReportOnCrash() 
{ 
    FirebaseCrash.report(new Exception("OOPS")); 
} 

残念ながら、偽のレポートは送信されませんが、Javaではコールバックを取得します。 私はFirebaseCrash.report()を呼び出すプロセス分離アクティビティを起動しようとしましたが、非静的な方法はありません。したがって、FirebaseApp/Crashはセカンダリアクティビティでインスタンス化されていないため、常にクラッシュします。

私はここに来て、誰かがそれを行う方法についてヒントを持っているかどうか尋ねる。

私の最後の試みが、少なくともテストは、このファイルが存在する場合はそうFirebaseCrash.logはその後、偽のレポートを送って使用する場合、ファイルにスタックトレースを書き、そして新たなスタート時に、テストすることですたかった...

答えて

0

JVMが致命的なエラーのためにabort()を呼び出した後にJava処理を実行することは保証されません。 the Java documentationパー:

SIGABRT

のHotSpot VMは、この信号を処理しません。代わりに、致命的なエラー処理の後で、アボート 関数を呼び出します。アプリケーションがこの シグナルを使用する場合、期待される セマンティクスを保持するためにプロセスを終了する必要があります。

はい、これはOracleの実装用です。他のすべての実装にも当てはまります。

abort()を呼び出す時点で、JVMは強制終了される予定です。

関連する問題