问题
We have random System.ArgumentException with Xamarin on android. It is completely random - it can occur anytime and anywhere, on any platform. We registered it on 5.1, 5.0, 4.4.4.
It has no adequate stacktrace, it has no place where it thrown, I can't catch it with anything. I think it might be somehow related to async void, we use MVVMCross in the project and there are many async void Init and async void DoMvxCommand methods. But all of them enclosed in try-catch blocks.
I crucially need any advice how to fix or at least find the reason of this crash. Here is the latest crash log
undefined INFO: ActivityManager : Displayed com.website.app/md599d9a15f782f9118e8e70c354562b227.SuccessPaymentView: +220ms
undefined WARN: ContextImpl : Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1629 com.android.server.InputMethodManagerService$6.run:2728 java.lang.Thread.run:818 <bottom of call stack> <bottom of call stack>
undefined WARN: ActivityManager : mDVFSHelper.release()
undefined INFO: Timeline : Timeline: Activity_windows_visible id: ActivityRecord{1aca0d50 u0 com.website.app/md599d9a15f782f9118e8e70c354562b227.SuccessPaymentView t5672} time:169720248
undefined INFO: MonoDroid : UNHANDLED EXCEPTION:
undefined INFO: MonoDroid : System.ArgumentException: 'jobject' must not be IntPtr.Zero.
undefined INFO: MonoDroid : Parameter name: jobject
undefined INFO: MonoDroid : at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x00028>
undefined INFO: MonoDroid : at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>m__0 (object) <0x0003f>
undefined INFO: MonoDroid : at Android.App.SyncContext/<Post>c__AnonStorey0.<>m__0 () <0x00027>
undefined INFO: MonoDroid : at Java.Lang.Thread/RunnableImplementor.Run () <0x0003f>
undefined INFO: MonoDroid : at Java.Lang.IRunnableInvoker.n_Run (intptr,intptr) <0x0003b>
undefined INFO: MonoDroid : at (wrapper dynamic-method) object.81971695-c4eb-4dd7-9e27-0dec45822877 (intptr,intptr) <0x0003b>
undefined DEBUG: LockPatternUtilsCache : getCarrierLockPlusMode()
undefined DEBUG: LockPatternUtilsCache : value : false
undefined WARN: Xamarin.Insights : Warning: Unhandled exception: System.ArgumentException: 'jobject' must not be IntPtr.Zero.
undefined WARN: Xamarin.Insights : Parameter name: jobject
undefined WARN: Xamarin.Insights : at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x00028>
undefined WARN: Xamarin.Insights : at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>m__0 (object) <0x0003f>
undefined WARN: Xamarin.Insights : at Android.App.SyncContext/<Post>c__AnonStorey0.<>m__0 () <0x00027>
undefined WARN: Xamarin.Insights : at Java.Lang.Thread/RunnableImplementor.Run () <0x0003f>
undefined WARN: Xamarin.Insights : at Java.Lang.IRunnableInvoker.n_Run (intptr,intptr) <0x0003b>
undefined WARN: Xamarin.Insights : at (wrapper dynamic-method) object.81971695-c4eb-4dd7-9e27-0dec45822877 (intptr,intptr) <0x0003b>
undefined WARN: art : JNI RegisterNativeMethods: attempt to register 0 native methods for md52ce486a14f4bcd95899665e9d932190b.JavaProxyThrowable
undefined DEBUG: AndroidRuntime : Shutting down VM
undefined WARN: System.err : java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
undefined WARN: System.err : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
undefined WARN: System.err : Caused by: java.lang.reflect.InvocationTargetException
undefined WARN: System.err : at java.lang.reflect.Method.invoke(Native Method)
undefined WARN: System.err : at java.lang.reflect.Method.invoke(Method.java:372)
undefined WARN: System.err : at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
undefined WARN: System.err : ... 1 more
undefined WARN: System.err : Caused by: md52ce486a14f4bcd95899665e9d932190b.JavaProxyThrowable: System.ArgumentException: 'jobject' must not be IntPtr.Zero.
undefined WARN: System.err : Parameter name: jobject
undefined WARN: System.err : at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x00028>
undefined WARN: System.err : at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>m__0 (object) <0x0003f>
undefined WARN: System.err : at Android.App.SyncContext/<Post>c__AnonStorey0.<>m__0 () <0x00027>
undefined WARN: System.err : at Java.Lang.Thread/RunnableImplementor.Run () <0x0003f>
undefined WARN: System.err : at Java.Lang.IRunnableInvoker.n_Run (intptr,intptr) <0x0003b>
undefined WARN: System.err : at (wrapper dynamic-method) object.81971695-c4eb-4dd7-9e27-0dec45822877 (intptr,intptr) <0x0003b>
undefined WARN: System.err : at mono.java.lang.RunnableImplementor.n_run(Native Method)
undefined WARN: System.err : at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:29)
undefined WARN: System.err : at android.os.Handler.handleCallback(Handler.java:739)
undefined WARN: System.err : at android.os.Handler.dispatchMessage(Handler.java:95)
undefined WARN: System.err : at android.os.Looper.loop(Looper.java:145)
undefined WARN: System.err : at android.app.ActivityThread.main(ActivityThread.java:5832)
undefined WARN: System.err : ... 4 more
undefined WARN: FlurryAgent : Error logged: uncaught
undefined WARN: FlurryAgent : Flurry session ended
undefined ERROR: AndroidRuntime : FATAL EXCEPTION: main
undefined ERROR: AndroidRuntime : Process: com.website.app, PID: 27622
undefined ERROR: AndroidRuntime : java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
undefined ERROR: AndroidRuntime : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
undefined ERROR: AndroidRuntime : Caused by: java.lang.reflect.InvocationTargetException
undefined ERROR: AndroidRuntime : at java.lang.reflect.Method.invoke(Native Method)
undefined ERROR: AndroidRuntime : at java.lang.reflect.Method.invoke(Method.java:372)
undefined ERROR: AndroidRuntime : at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
undefined ERROR: AndroidRuntime : ... 1 more
undefined ERROR: AndroidRuntime : Caused by: md52ce486a14f4bcd95899665e9d932190b.JavaProxyThrowable: System.ArgumentException: 'jobject' must not be IntPtr.Zero.
undefined ERROR: AndroidRuntime : Parameter name: jobject
undefined ERROR: AndroidRuntime : at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x00028>
undefined ERROR: AndroidRuntime : at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>m__0 (object) <0x0003f>
undefined ERROR: AndroidRuntime : at Android.App.SyncContext/<Post>c__AnonStorey0.<>m__0 () <0x00027>
undefined ERROR: AndroidRuntime : at Java.Lang.Thread/RunnableImplementor.Run () <0x0003f>
undefined ERROR: AndroidRuntime : at Java.Lang.IRunnableInvoker.n_Run (intptr,intptr) <0x0003b>
undefined ERROR: AndroidRuntime : at (wrapper dynamic-method) object.81971695-c4eb-4dd7-9e27-0dec45822877 (intptr,intptr) <0x0003b>
undefined ERROR: AndroidRuntime : at mono.java.lang.RunnableImplementor.n_run(Native Method)
undefined ERROR: AndroidRuntime : at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:29)
undefined ERROR: AndroidRuntime : at android.os.Handler.handleCallback(Handler.java:739)
undefined ERROR: AndroidRuntime : at android.os.Handler.dispatchMessage(Handler.java:95)
undefined ERROR: AndroidRuntime : at android.os.Looper.loop(Looper.java:145)
undefined ERROR: AndroidRuntime : at android.app.ActivityThread.main(ActivityThread.java:5832)
undefined ERROR: AndroidRuntime : ... 4 more
undefined WARN: ActivityManager : Force finishing activity com.website.app/md599d9a15f782f9118e8e70c354562b227.SuccessPaymentView
undefined DEBUG: PowerManagerService : [input device light] setInputDeviceLightOn is called : 1
undefined WARN: ActivityManager : Force finishing activity com.website.app/md599d9a15f782f9118e8e70c354562b227.PaymentFormView
undefined INFO: SQLiteSecureOpenHelper : getWritableDatabase(pwd)
undefined INFO: SQLiteSecureOpenHelper : getDatabaseLocked(b,b,pwd)...
undefined INFO: dumpstate : begin
undefined DEBUG: StatusBarManagerService : manageDisableList userId=0 what=0x0 pkg=WindowManager.LayoutParams
undefined INFO: SurfaceFlinger : id=3018 createSurf (49x49),1 flag=4, Application Error: com.website.app
undefined DEBUG: CrashAnrDetector : processName: com.website.app
undefined DEBUG: CrashAnrDetector : broadcastEvent : com.website.app data_app_crash
undefined INFO: SQLiteSecureOpenHelper : getWritableDatabase(pwd)
undefined INFO: SQLiteSecureOpenHelper : getDatabaseLocked(b,b,pwd)...
undefined WARN: ContextImpl : Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1643 com.android.server.analytics.data.collection.application.CrashAnrDetector.broadcastEvent:296 com.android.server.analytics.data.collection.application.CrashAnrDetector.processDropBoxEntry:254 com.android.server.analytics.data.collection.application.CrashAnrDetector.access$100:60 com.android.server.analytics.data.collection.application.CrashAnrDetector$1.onReceive:102
undefined INFO: WifiStateMachine : CMD_RSSI_POLL : calculateWifiScore in!
undefined INFO: WifiStateMachine : CMD_RSSI_POLL : calculateWifiScore out!
undefined INFO: WifiStateMachine : CMD_RSSI_POLL : out!
undefined ERROR: android.os.Debug : !@Dumpstate > sdumpstate -k -t -z -d -o /data/log/dumpstate_app_error
回答1:
I had a very similar issue with Android throwing NullRefenceExceptions seemingly randomly (which was actually because things were running asynchronously/concurrently) and they would never break at the correct spot and the StackTrace was completely worthless. See the thread and solution here.
Anyway, 2 parts of the solution that allowed me to figure out the issue were:
- Turn on the setting in Visual Studio in order to break/throw on the specific exception. To do this, head to this post. The post describes going to Visual Studio -> Debug -> Exceptions... (or
Ctrl+Alt+E)
Then, to find that exception, expand 'Common Language Runtime Exceptions' -> 'System' -> then check the 'Thrown' box next 'System.ArgumentException'. Now it will, hopefully, break on the line where that exception actually happens. Also you will definitely want to turn this off once the issue has been fixed so that you do not start hitting exceptions that you do not really need to handle.
- Override Android's exception handler event, called
UnhandledExceptionRaiser, and then set a breakpoint within the event in order to help you catch some of these exceptions before your app crashes. The event info can be found in this post (I ended up just putting that event intoMainActivity.cs.
Here is my exception event code:
AndroidEnvironment.UnhandledExceptionRaiser += (sender, args) => {
args.Handled = false;
};
I just put a break point on args.Handled and look through the details but you could also print out the exception or something.
- Finally, one more thing that I found on my own but have heard others mention, is that you can usually find more helpful exception source info by digging into the exception details and finding
captured_traces.
To find this, you need to keep expanding the exception instance's base property, in the exception details window, until you are in System.Exception. Then follow the steps below (though sometimes you have to go into the inner exception before following the below steps):
System.Exception -> Non-public members -> captured_traces -> then you usually want [0] but sometimes there are others to look through -> Non-public members -> frames -> now you usually either want [0] or you want the last one in the list -> Non-public members -> and finally you will be able to see the file in the fileName property and the line number in the 'lineNumber' property (imagine that).
Now I am sure there is a fancy way to extract this info with reflection or something without digging through the exception details. If anyone knowns how, I would love to hear it!
来源:https://stackoverflow.com/questions/32654645/random-system-argumentexception-jobject-must-not-be-intptr-zero