我正在尝试为我的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编译进行优化? (堆栈跟踪在调试模式下是预期的。)
答案 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未暴露于该数据,则无法获得堆栈跟踪。发生的异常或崩溃只发生在主方法上,通常表示较低级别的问题。