单点触控堆栈跟踪不详细

本文关键字:跟踪 堆栈 单点触 | 更新日期: 2023-09-27 17:57:15

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

如果我将处理程序附加到AppDomain.CurrentDomain.UnhandledException,则根本不存在堆栈跟踪,即.属性为空或空。

如果我将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 编译完全优化?(堆栈跟踪在调试模式下符合预期。

单点触控堆栈跟踪不详细

使用 -

-debug 命令行选项或在 MonoDevelopment 中选择配置 "Debug|iPhone"。

请记住,此选项将导致执行速度变慢,但您会在异常等中获得行号。

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

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

此过程从以下代码开始:

    StackTrace trace = new StackTrace(true);
    foreach(StackFrame frame in trace.GetFrames())
        ... log data to log file

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