Xamarin.Mac 故障排除技巧
概述
有时,我们在做项目时都会遇到停滞不前的情况,要么无法让 API 按照我们想要的方式工作,要么试图解决 bug。 Xamarin 的目标是让你成功编写移动和桌面应用程序,我们提供了一些资源来帮助你。
借助这些资源,你可以执行一些准备步骤,帮助他们快速解决问题:
尽可能确定问题的根本原因,以报告崩溃:
“我的应用程序崩溃”很难诊断。 “将空数组返回到此调用时,应用程序崩溃”可以更轻松地进行修复。
与“无法让 NSTable 正常工作”相比,“我的 NSTableDelegate 上的任何方法似乎都不是在这种情况下调用的”更有帮助。
如果可能,请提供一个显示问题的小型示例程序。 在源代码页中挖掘查找问题需要花费大量时间和精力。
了解对应用程序进行的哪些更改导致出现问题,这可以快速缩小问题的根源范围。 请注意,如果你最近升级了 Xamarin.Mac 的版本,请修剪应用程序的各个部分以找到导致问题的部分,或者测试以前的版本以找出导致问题的更改,这样做可能非常有用。
当应用崩溃且无输出时该怎么办
在大多数情况下,Visual Studio for Mac 中的调试程序会捕获应用程序中的异常和崩溃,并帮助你找出根本原因。 但是,在某些情况下,应用程序会在扩展坞上弹跳,然后在提供很少或没有输出的情况下退出。 这些可以包括:
- 代码签名问题。
- 某些 Mono 运行时崩溃。
- 某些 Objective-c 异常和崩溃。
- 某些在进程生存期的早期就崩溃了。
- 某些堆栈溢出。
- Info.plist 中列出的 macOS 版本比当前安装的 macOS 版本更新,或者它无效。
调试这些程序可能会令人沮丧,因为查找所需的信息可能很困难。 下面是一些可能有帮助的方法:
确保 Info.plist 中列出的 macOS 版本与计算机上当前安装的 macOS 版本相同。
检查 Visual Studio for Mac 应用程序输出(“视图”->“面板”->“应用程序输出”),了解可描述输出的 Cocoa 中的堆栈跟踪或输出(红色)。
从命令行运行应用程序,并使用以下命令查看输出(在终端应用中):
MyApp.app/Contents/MacOS/MyApp
(其中MyApp
为应用程序的名称)可以通过在命令行中将“MONO_LOG_LEVEL”添加到命令来增加输出,例如:
MONO_LOG_LEVEL=debug MyApp.app/Contents/MacOS/MyApp
可以将本机调试程序 (
lldb
) 附加到进程,以查看这是否提供了更多信息(这需要付费许可证)。 例如,执行以下操作:- 在终端中输入
lldb MyApp.app/Contents/MacOS/MyApp
。 - 在终端中输入
run
。 - 在终端中输入
c
。 - 完成调试后退出。
- 在终端中输入
作为最后手段,在
Main
方法中(或根据需要在其他位置)调用NSApplication.Init
之前,可以将文本写入已知位置的文件中,以跟踪你遇到问题的启动步骤。
已知问题
以下部分介绍已知问题及其解决方案。
无法在沙盒应用中连接到调试程序
调试程序通过 TCP 连接到 Xamarin.Mac 应用,这意味着在启用沙盒时,默认情况下它无法连接到应用,因此如果尝试在没有启用适当权限的情况下运行应用,你会收到“无法连接到调试程序”错误。
调试程序需要“允许传出网络连接(客户端)”权限,启用此权限可实现正常调试。 你不能在没有此权限的情况下进行调试,因此我们已为 msbuild
更新 CompileEntitlements
目标,以便自动将该权限添加到仅针对调试生成沙盒化的任何应用的权利中。 发布版本应使用权利文件中指定的权利(未修改)。
System.NotSupportedException:没有数据可用于编码 437
在 Xamarin.Mac 应用中包括第三方库时,如果试图编译和运行应用,则可能会收到“System.NotSupportedException:没有数据可用于编码 437”形式的错误。 例如,库(如 Ionic.Zip.ZipFile
)可能会在操作期间引发此异常。
可以通过打开 Xamarin.Mac 项目的选项,转到“Mac 生成”>“国际化”并选择 West 国际化来解决此问题:
未能编译 (mm5103)
当新版本的 Xcode 发布,并且你已安装新版本但尚未运行该版本时,通常会导致此错误。 在尝试使用新版本的 Xcode 进行编译之前,需要首先至少运行该版本一次。
首次运行新版本的 Xcode 时,它将安装 Xamarin.Mac 所需的多个命令行工具。 此外,更新 Xcode 或 Xamarin.Mac 版本后,应执行干净生成。
如果无法解决此问题,请提交 Bug。
缺少 entitlements.plist
最新版本的 Visual Studio for Mac 已从 Info.plist 编辑器中删除了“权利”部分,并将其放置在单独的 Entitlements.plist 编辑器中(以更好地支持 Xamarin.iOS 的跨平台功能)。
安装新的 Visual Studio for Mac 后,创建新的 Xamarin.Mac 应用项目时,Entitlements.plist 文件将自动添加到项目树中:
如果双击 Entitlements.plist 文件,将显示权利编辑器:
对于现有的 Xamarin.Mac 项目,需要手动创建 Entitlements.plist 文件,方法是右键单击 Solution Pad 中的项目并选择“添加”>“新建文件...”。接下来,选择“Xamarin.Mac”>“空属性列表”:
输入 Entitlements
作为名称,然后单击“新建”按钮。 如果项目以前包含权利文件,则系统会提示将其添加到项目,而不是创建新文件:
论坛上的社区支持
使用 Xamarin 产品的开发人员社区非常出色,许多人会访问我们的 Xamarin.Mac 论坛,以分享经验和专业知识。 此外,Xamarin 工程师会定期访问论坛以提供帮助。
提交 Bug
反馈对我们非常重要。 如果发现 Xamarin.Mac 存在任何问题:
- 搜索问题存储库
- 如果找不到匹配的问题,请在 GitHub 问题存储库中提交一个新问题。
GitHub 的问题是完全公开的。 不能隐藏注释或附件。
请尽可能多地包含以下内容:
- 一个重现此问题的简单示例。 在可能的情况下,这非常有用。
- 故障的完整堆栈跟踪。
- 故障周围的 C# 代码。