4

上記のコンポーネントを動作させようとしていました。

http://components.xamarin.com/view/hockeyappios

Xamarin Studio テンプレート (Android Ice Cream Sandwich アプリケーション) に基づいて非常に単純なプロジェクトを作成し、HockeyApp に例外を送信するために必要なコードを追加しました。このコードは次のページで説明されています

http://components.xamarin.com/gettingstarted/hockeyappandroid

残念ながら、例外情報ファイルの保存に重大な問題が見つかりました

HockeyApp.ManagedExceptionHandler.SaveException (e.ExceptionObject)

この呼び出しにより、次のエラーが発生します

[mono-rt] Stacktrace:
[mono-rt] 
[mono-rt]   at <unknown> <0xffffffff>
[mono-rt]   at (wrapper managed-to-native) object.wrapper_native_0x407339b5 (intptr,string) <IL 0x00038, 0xffffffff>
[mono-rt]   at Android.Runtime.JNIEnv.FindClass (string) [0x00000] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:377
[mono-rt]   at Android.Runtime.JNIEnv.FindClass (string,intptr&) [0x00014] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:409
[mono-rt]   at Android.OS.Looper.get_class_ref () [0x00000] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.OS.Looper.cs:14
[mono-rt]   at Android.OS.Looper.get_MainLooper () [0x00014] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.OS.Looper.cs:34
[mono-rt]   at Android.App.SyncContext.Send (System.Threading.SendOrPostCallback,object) [0x00014] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/src/Android.App/SyncContext.cs:24
[mono-rt]   at HockeyApp.ManagedExceptionHandler.Save (string) <IL 0x0001f, 0x00157>
[mono-rt]   at HockeyApp.ManagedExceptionHandler.SaveException (object) <IL 0x00006, 0x0006b>
[mono-rt]   at HockeyAppTest.App.<OnCreate>b__0 (object,System.UnhandledExceptionEventArgs) [0x00002] in c:\Snapshot\HockeyAppTest\Application.cs:33
[mono-rt]   at (wrapper runtime-invoke) <Module>.runtime_invoke_void__this___object_object (object,intptr,intptr,intptr) <IL 0x0005a, 0xffffffff>
[mono-rt] 
[mono-rt] =================================================================
[mono-rt] Got a SIGSEGV while executing native code. This usually indicates
[mono-rt] a fatal error in the mono runtime or one of the native libraries 
[mono-rt] used by your application.
[mono-rt] =================================================================

問題の調査中に、次の情報に出くわしました

  • 処理された例外は問題なく格納できます
  • 問題は AppDomain.CurrentDomain.UnhandledException ハンドラでのみ発生します

次に、 AppDomain.CurrentDomain.UnhandledException ハンドラー内で次のコードを試しました

string eStr = e.ExceptionObject.ToString();
Java.Lang.Throwable thr = new Java.Lang.Throwable(eStr);

このコードは非常によく似たエラーを引き起こしました

[mono-rt] Stacktrace:
[mono-rt] 
[mono-rt]   at <unknown> <0xffffffff>
[mono-rt]   at (wrapper managed-to-native) object.wrapper_native_0x4072e4e5 (intptr,intptr,int) <IL 0x00027, 0xffffffff>
[mono-rt]   at Android.Runtime.JNIEnv.NewString (string) [0x00017] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:666
[mono-rt]   at Java.Lang.Throwable..ctor (string) [0x00022] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Java.Lang.Throwable.cs:50
[mono-rt]   at HockeyAppTest.App.<OnCreate>b__0 (object,System.UnhandledExceptionEventArgs) [0x0000d] in c:\Snapshot\HockeyAppTest\Application.cs:34
[mono-rt]   at (wrapper runtime-invoke) <Module>.runtime_invoke_void__this___object_object (object,intptr,intptr,intptr) <IL 0x0005a, 0xffffffff>

これは、AppDomain.CurrentDomain.UnhandledException 内で「Java バインディング」を使用するコード呼び出しの一般的な問題ですか?

4

2 に答える 2

4

2 番目のエラーは、未処理の c# 例外の例外ハンドラーが、実際には JNI アクセスを持たない変な空間で実行されるためです。

C# の例外を HockeyApp 形式に直接書き出し、Java の例外のみを HockeyApp ライブラリに直接報告することで、小さなラッパー グルーを使用して、コンポーネントなしで動作させることができます。

これは私が使用するものですhttps://github.com/tpurtell/AndroidHockeyApp/blob/master/Additions/TraceWriter.cs#L84

HockeyApp は Exception のフォーマットについて少し専門的であるため、このコードは完全ではなく、一部のスタック トレースが Web サイトで例外名によってグループ化されますが、例外はすべてここに表示されます。

于 2014-07-03T04:58:48.060 に答える
0

これが問題のより簡単な解決策です

使用する:

  AndroidEnvironment.UnhandledExceptionRaiser += (s, e) => 
       HockeyApp.ManagedExceptionHandler.SaveException(e.Exception);
  Thread.DefaultUncaughtExceptionHandler = new UnCaughtExceptionHandler(this);

代わりに:

AppDomain.CurrentDomain.UnhandledException += (sender, e) => 
            HockeyApp.ManagedExceptionHandler.SaveException (e.ExceptionObject);

whereUnCaughtExceptionHandlerは、例外をログに記録するクラスの実装にすぎませんHockeyApp.ManagedExceptionHandler.SaveException()(完全な実装は以下にあります)。これは、スローされた例外の回避策であり、HockeyApp.ManagedExceptionHandler.SaveException(object exceptionObject)最終的には整理されると思います。


UnCaughtExceptionHandler クラスの実装

    class UnCaughtExceptionHandler : Java.Lang.Object, Thread.IUncaughtExceptionHandler
    {
        readonly Context context;
        public UnCaughtExceptionHandler(Context context)
        {
            this.context = context;
        }

        public void UncaughtException(Thread thread, Throwable ex)
        {
           HockeyApp.ManagedExceptionHandler.SaveException(ex);
        }

    }
于 2014-09-01T13:06:35.653 に答える