问题描述
|
我正在尝试为我的MonoTouch代码实现一个有用的常规异常处理程序。
如果将处理程序附加到``0'',则根本不存在堆栈跟踪,即.StackTrace属性为null或为空。
如果我将
UIApplication.Main(args)
调用包装在try {} catch {}
中,则堆栈跟踪将不包含任何有用的信息:
at MonoTouch.UIKit.UIApplication.Main (System.String[] args,System.String principalClassName,System.String delegateClassName) [0x00000] in <filename unkNown>:0
at MonoTouch.UIKit.UIApplication.Main (System.String[] args) [0x00000] in <filename unkNown>:0
at MyNamespace.MyProduct.MyProject.Application.Main (System.String[] args) [0x00000] in <filename unkNown>:0
即它没有比我捕获异常的Main()方法更深入。
有什么想法可以让我从堆栈跟踪中获取更多有用的信息,还是可以通过AOT编译将其完全优化掉? (在调试模式下,堆栈跟踪是预期的。)
解决方法
您将无法在发行代码中获取行号或文件名。该信息被删除。但是,您仍然应该能够将完整的堆栈跟踪信息放入代码中,至少可以看到类/调用层次结构。
我猜想您必须在事后对此进行调查,因为您无法调试或捕获发布版本中正在运行的异常。我倾向于将异常记录到日志文件中以供日后检查。
此过程从以下代码开始:
StackTrace trace = new StackTrace(true);
foreach(StackFrame frame in trace.GetFrames())
... log data to log file
您也可以创建带有异常的StackTrace对象。我会开始在那附近玩。请记住,在很多情况下,如果错误发生在iOS部分的深处,则您将无法获得堆栈跟踪,因为Mono没有暴露给该数据。仅发生在主要方法上的异常或崩溃通常表示较低级别的问题。
,使用--debug命令行选项或在MonoDevelop中选择配置\“ Debug | iPhone \”。
请记住,此选项将导致执行速度变慢,但在异常等情况下您将获得行号。