MonoTouch堆栈跟踪不详细

tom*_*ing 5 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 
Run Code Online (Sandbox Code Playgroud)

即它没有比我捕获异常的Main()方法更深入.

任何想法我怎么能在堆栈跟踪中获得更多有用的信息,还是完全通过AOT编译完全优化?(堆栈跟踪在调试模式下是预期的.)

小智 1

您将无法获取发布代码中的行号或文件名。该信息已被删除。但是,您仍然应该能够在代码中获取完整的堆栈跟踪,以至少查看类/调用层次结构。

我猜您一定在事后调查这一点,因为您无法调试或捕获发布版本上的运行异常。我倾向于做的是将异常记录到日志文件中以便稍后检查。

该过程从以下代码开始:

    StackTrace trace = new StackTrace(true);

    foreach(StackFrame frame in trace.GetFrames())
        ... log data to log file
Run Code Online (Sandbox Code Playgroud)

您还可以创建带有异常的 StackTrace 对象。我会开始在那里玩耍。请记住,在许多情况下,如果错误发生在 iOS 部分的深处,您将无法获得堆栈跟踪,因为 Mono 不会暴露于该数据。仅发生到主方法的异常或崩溃通常表明存在较低级别的问题。