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 应用程序输出(视图 ->Pads ->Application Output),了解可描述输出的 Cocoa 中的堆栈跟踪或输出(红色)。

  • 从命令行运行应用程序,并使用以下命令查看输出(在 终端 应用中):

    MyApp.app/Contents/MacOS/MyApp (应用程序的名称在哪里 MyApp

  • 可以通过在命令行上将“MONO_LOG_LEVEL”添加到命令来增加输出,例如:

    MONO_LOG_LEVEL=debug MyApp.app/Contents/MacOS/MyApp

  • 可以将本机调试器 (lldb) 附加到进程,以查看该调试器是否提供了更多信息(这需要付费许可证)。 例如,执行以下操作:

    1. 在终端中输入 lldb MyApp.app/Contents/MacOS/MyApp
    2. 在终端中输入 run
    3. 在终端中输入 c
    4. 完成调试后退出。
  • 作为最后手段,在调用 NSApplication.Init 方法 Main (或根据需要在其他地方)之前,可以将文本写入已知位置的文件,以跟踪你遇到问题的启动步骤。

已知问题

以下部分介绍已知问题及其解决方案。

无法在沙盒应用中连接到调试器

调试器通过 TCP 连接到 Xamarin.Mac 应用,这意味着在启用沙盒时,它无法连接到应用,因此,如果尝试在没有启用适当权限的情况下运行应用,则会收到错误“无法连接到调试器”。

Editing the entitlements in the App sandbox.

允许传出网络连接(客户端)权限是调试器所需的权限,启用此权限将允许正常调试。 由于你不能在没有调试的情况下进行调试,因此我们已更新 CompileEntitlements 了目标,以便 msbuild 自动将该权限添加到仅针对调试生成沙盒的任何应用的权利。 发布版本应使用权利文件中指定的权利(未修改)。

System.NotSupportedException:没有数据可用于编码 437

在 Xamarin.Mac 应用中包括第三方库时,在尝试编译和运行应用时,可能会收到“System.NotSupportedException: 没有数据可用于编码 437” 格式的错误。 例如,库(例如 Ionic.Zip.ZipFile)可能会在操作期间引发此异常。

可以通过打开 Xamarin.Mac 项目的选项来解决此问题,转到 Mac 生成>国际化并检查西部国际化:

Editing the build options

无法编译(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 文件将自动添加到项目树中:

Selecting entitlements

如果双击 Entitlements.plist 文件,将显示权利编辑器:

Editing the entitlements

对于现有的 Xamarin.Mac 项目,需要通过右键单击 Solution Pad 中的项目并选择“添加新>文件...”来手动创建 Entitlements.plist 文件。接下来,选择 Xamarin.Mac>空属性列表:

Adding a new property list

输入Entitlements名称,然后单击“新建按钮。 如果项目以前包含权利文件,系统会提示将其添加到项目,而不是创建新文件:

Verifying the overwrite of a file

论坛上的社区支持

使用 Xamarin 产品的开发人员社区非常出色,许多人请访问我们的 Xamarin.Mac 论坛 ,分享经验和专业知识。 此外,Xamarin 工程师定期访问论坛以帮助。

提交 bug

反馈对我们非常重要。 如果发现 Xamarin.Mac 存在任何问题:

GitHub 的问题是完全公开的。 不能隐藏注释或附件。

请尽可能多地包含以下内容:

  • 一个重现此问题的简单示例。 在可能的情况下,这非常有用
  • 故障的完整堆栈跟踪。
  • 故障周围的 C# 代码。