MonoTouch堆栈痕迹未详细说明

问题描述

| 我正在尝试为我的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 \”。 请记住,此选项将导致执行速度变慢,但在异常等情况下您将获得行号。