MonoTouch堆栈跟踪不详细

时间:2011-05-23 13:40:28

标签: c# exception-handling xamarin.ios

我正在尝试为我的MonoTouch代码实现一个有用的通用异常处理程序。

如果我将处理程序附加到AppDomain.CurrentDomain.UnhandledException,则根本不存在堆栈跟踪,即.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编译进行优化? (堆栈跟踪在调试模式下是预期的。)

2 个答案:

答案 0 :(得分:3)

使用--debug命令行选项或在MonoDevelop中选择配置“Debug | iPhone”。

请记住,此选项会导致执行速度变慢,但您会在例外等中获取行号。

答案 1 :(得分:1)

您将无法在发布代码中获取行号或文件名。该信息被剥夺了。但是,您仍然可以在代码中获取完整的堆栈跟踪,以至少看到类/调用层次结构。

我猜你必须在事后调查此事,因为你无法在发布版本上调试或捕获运行异常。我倾向于将我的异常记录到日志文件中以便稍后检查。

此过程从以下代码开始:

    StackTrace trace = new StackTrace(true);

    foreach(StackFrame frame in trace.GetFrames())
        ... log data to log file

您也可以使用异常创建StackTrace对象。我会在那里开始玩。请记住,在许多情况下,如果错误发生在iOS部分内部,因为Mono未暴露于该数据,则无法获得堆栈跟踪。发生的异常或崩溃只发生在主方法上,通常表示较低级别的问题。