在WinRt环境下异步调试定位问题
在用C#开发WP或者win8的时候,通过async和await来使用异步机制是非常常用的,能够让开发者像使用同步方法那样调用异步方法。在函数编译的时候await方法被优化成了状态机的形式,所以导致在异步方法出现异常时,打印的log调用堆栈无法定位到异常抛出的方法。这里介绍一种定位异常的方法。
以下面的log为例:
UnhandledException : Illegalcharacters in path. : at System.IO.Path.CheckInvalidPathChars(String path,Boolean checkAdditional)
at System.IO.Path.Combine(String path1, Stringpath2)
atMicrosoft.Phone.Storage.ExternalStorageFolder.GetFolders()
at System.Threading.Tasks.Task`1.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous locationwhere exception was thrown ---
atSystem.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
atSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Tasktask)
atSystem.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
atEasyReader.ViewModel.SDCardImportViewModel.d__11.MoveNext()
--- End of stack trace from previous locationwhere exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Tasktask)
atSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Tasktask)
atSystem.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at EasyReader.ViewModel.SDCardImportViewModel.d__25.MoveNext()
--- End of stack tracefrom previous location where exception was thrown ---
atSystem.Runtime.CompilerServices.AsyncMethodBuilderCore.b__3(Object state)
在log记录的堆栈中,只能定位到SDCardImportViewModel这个类,但是,但是方法确是d_11和d_25,这两个方法(确切的说是记录方法信息的结构体)是由编译的时候编译器自动生成的。想要定位这两个方法的位置。
可以用reflectort打开app包(在你的工程目录bin下有个.XAP),可以看到代码被编译成了一个个dll,找到SDCardImportViewModel所在的位置,并打开。如图,可以看到d_11和d_25两个方法,前面有个<>,里面的就是所要定位的两个方法。