在WinRt环境下异步调试定位问题

7 篇文章 0 订阅
7 篇文章 0 订阅

在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两个方法,前面有个<>,里面的就是所要定位的两个方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值