Как я могу отладить мое приложение Xamarin, когда оно выходит из строя только в режиме выпуска? - PullRequest
1 голос
/ 20 сентября 2019

Недавно я обнаружил, что, когда я запускал свое приложение на версии для Android в режиме выпуска, мое поле «Специальность» было пустым без параметров, на которые можно было бы перейти.Проблема в том, что трудно отладить проблему, потому что я не могу просмотреть свой код и проанализировать значения переменных до возникновения проблемы.В течение нескольких дней я искал способ увидеть значения, либо записав их в консоль, создав файлы со строками в них и т. Д., Но безуспешно.

К счастью, мне удалось определить причину проблемы с помощью alerttdisplays, которыйне показывался, но вызывал аварийное завершение приложения, если они были показаны, поэтому я смог увидеть, насколько высоко я мог бы добавить alerttdisplay в свой оператор try catch до того, как оно вылетит из приложения.Если не было сбоев, было предложено, чтобы оператор try переключился на перехват в строке перед отображением оповещения.

Несколько замечаний:

  • Он только прерывается наРежим релиза Android
  • Он отлично работает в режиме релиза и отладки IOS
  • Режим релиза работает на Android, если я включаю общую моно-среду выполнения (но это означает, что я не могу опубликовать приложение)
  • Режим отладки работает независимо от того, используется ли общая моно среда выполнения
  • Я пробовал как на физическом, так и на виртуальном устройстве для Android, один и тот же результат

Вот здесь уловка попыткиоператор, который предназначен для извлечения списка специальностей из URI (помещение URI в мою строку поиска показывает мне правильный список специальностей), которое вызывает исключение:

/// Summary: Gets the specialty list 
/// Returns: JArray of specialties   
public async Task<string> getSpecialtyAsync()
{
    HttpClient client = new HttpClient();
    var uri = new Uri(string.Format("https://medphys.royalsurrey.nhs.uk/space/tools/web_services.php?cmd=getSpecialtyList", string.Empty));            
    try
    {
        var response = await client.GetAsync(uri); //This line seems to cause the catch to fire
        if (response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();
            return content;
        }

    }
    catch (Exception ex)
    {
        //How do i print out the exception here, along with some variable values?
    }           
    return null;
}

Это появляется в консоли, когда янажмите кнопку поиска с пустым полем Specialty:

[MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] System.InvalidCastException: Specified cast is not valid.
[MonoDroid]   at SPACE.PathwaySearch..ctor (System.String searchTerm) [0x00079] in <a380d4923fda450eadc5c42fb0c107d2>:0 
[MonoDroid]   at SPACE.SearchPage+<>c__DisplayClass1_0.<.ctor>b__2 (System.Object s, System.EventArgs e) [0x00167] in <a380d4923fda450eadc5c42fb0c107d2>:0 
[MonoDroid]   at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__7_0 (System.Object state) [0x00000] in <a49690ecb3764be9bb02bbcc2d264f28>:0 
[MonoDroid]   at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0 () [0x00000] in <6eddb440f9714f0591fc9a4fcb875afa>:0 
[MonoDroid]   at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <6eddb440f9714f0591fc9a4fcb875afa>:0 
[MonoDroid]   at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in <6eddb440f9714f0591fc9a4fcb875afa>:0 
[MonoDroid]   at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.35(intptr,intptr)
[alPhysics.SPAC] JNI RegisterNativeMethods: attempt to register 0 native methods for android.runtime.JavaProxyThrowable
[AndroidRuntime] Shutting down VM
[AndroidRuntime] FATAL EXCEPTION: main
[AndroidRuntime] Process: com.NHS.rsch.MedicalPhysics.SPACE, PID: 13871
[AndroidRuntime] android.runtime.JavaProxyThrowable: System.InvalidCastException: Specified cast is not valid.
[AndroidRuntime]   at SPACE.PathwaySearch..ctor (System.String searchTerm) [0x00079] in <a380d4923fda450eadc5c42fb0c107d2>:0 
[AndroidRuntime]   at SPACE.SearchPage+<>c__DisplayClass1_0.<.ctor>b__2 (System.Object s, System.EventArgs e) [0x00167] in <a380d4923fda450eadc5c42fb0c107d2>:0 
[AndroidRuntime]   at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__7_0 (System.Object state) [0x00000] in <a49690ecb3764be9bb02bbcc2d264f28>:0 
[AndroidRuntime]   at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0 () [0x00000] in <6eddb440f9714f0591fc9a4fcb875afa>:0 
[AndroidRuntime]   at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <6eddb440f9714f0591fc9a4fcb875afa>:0 
[AndroidRuntime]   at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in <6eddb440f9714f0591fc9a4fcb875afa>:0 
[AndroidRuntime]   at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.35(intptr,intptr)
[AndroidRuntime]    at mono.java.lang.RunnableImplementor.n_run(Native Method)
[AndroidRuntime]    at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:30)
[AndroidRuntime]    at android.os.Handler.handleCallback(Handler.java:873)
[AndroidRuntime]    at android.os.Handler.dispatchMessage(Handler.java:99)
[AndroidRuntime]    at android.os.Looper.loop(Looper.java:193)
[AndroidRuntime]    at android.app.ActivityThread.main(ActivityThread.java:6669)
[AndroidRuntime]    at java.lang.reflect.Method.invoke(Native Method)
[AndroidRuntime]    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
[AndroidRuntime]    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

1 Ответ

0 голосов
/ 24 сентября 2019

Я так и не узнал, как отлаживать приложение, но нашел способ решить проблему, с которой столкнулся.Я просто пошел в проект droid -> свойства -> манифест android и поставил галочку на 4 ячейках, связанных с этим

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...