调试 Xamarin.iOS 应用

可以使用 Visual Studio for Mac 或 Visual Studio 中的内置调试程序调试 Xamarin.iOS 应用程序。

需要调试可能与 Xamarin.iOS 项目关联的 C、C++ 或 Objective C 代码时,使用 Visual Studio for Mac 的本机调试支持调试 C# 和其他托管语言代码,然后使用 LLDB

注意

在“调试”模式下编译应用时,Xamarin.iOS 生成的应用不仅速度慢,而且还很大,因为必须检测所有代码行。 发布之前,请确保创建一个“发布”版本。

Xamarin.iOS 调试器集成到了 IDE 中,它允许开发人员在模拟器或设备上调试使用 Xamarin.iOS 支持的任何托管语言生成的 Xamarin.iOS 应用程序。

Xamarin.iOS 调试器使用 Mono 软调试器,这意味着生成的代码和 Mono 运行时将与 IDE 配合提供调试体验。 这与 LLDB 或 MDB 等硬调试器不同,硬调试器不需要调试程序方面的知识或配合,即可控制程序。

设置断点

准备好开始调试应用程序时,第一步是设置应用程序的断点。 单击编辑器中想要中断的代码行数旁的边缘区域,即可实现此操作:

可转到“Breakpoints pad”面板,查看代码中已设置的所有断点:

The Breakpoints pad

如果“Breakpoints pad”未自动显示,可以依次选择“视图”>“调试窗口”>“断点”调出它

开始调试任何应用程序之前,应始终确保配置已设为“调试”,因为其中有一套有用的工具,可支持调试(比如断点),使用数据可视化工具以及查看调用堆栈:

开始调试

若要开始调试,在 IDE 中选择目标设备或类似目标:

然后通过按“播放”按钮部署应用程序。

命中断点时,代码会以黄色突出显示:

The code will be highlighted yellow

此时,可使用调试工具(如检查对象的值)获取代码中所发生情况的相关详细信息:

Displaying a color value

条件断点

还可以设置规则,规定应该发生断点的情况,称为添加条件断点

若要设置条件断点,请访问“断点属性”窗口,可通过以下两种方式实现此操作:

  • 若要添加新的条件断点,请右键单击编辑器边缘(即要设置断点的代码行号左侧),再选择“新建断点”:

    Select New Breakpoint

  • 若要向现有断点添加条件,请右键单击该断点并选择“断点属性”,或如下图所示在“断点”面板中选择“属性”按钮:

    The Breakpoints Pad

然后可输入想要断点发生的条件:

Enter the condition for the breakpoint to occur

到达断点时,调试工具使用户能够控制该程序的执行。 IDE 将显示四个按钮,使用户能够逐行运行代码。

在 Visual Studio for Mac 中,它们将显示如下:

The Debug tools enable the developer to get control over the program’s execution

这些功能是:

  • “播放/停止” -此按钮开始/停止执行代码,直至下一个断点处。
  • 单步跳过 - 此按钮执行下一行代码。 如果下一行是函数调用,“单步跳过”将执行该函数,并在该函数后的下一行代码停止。
  • 单步执行 - 此按钮也执行下一行代码。 如果下一行是函数调用,“单步执行”将在该函数的第一行停止,允许继续进行函数的逐行调试。 如果下一行不是函数,其行为与“单步跳过”相同。
  • 跳出 - 此按钮返回到调用当前函数的代码行。

断点

需要指出的是,iOS 仅给应用程序几秒 (10) 时间在“应用程序”委派中启动并完成 FinishedLaunching 方法。 如果应用程序在 10 秒内未完成此方法,则 iOS 将终止该进程。

这意味着,在应用程序的启动代码上设置断点几乎是不可能的。 如果想要调试启动代码,应延迟其某些初始化,并将其放入已调用计时器的方法,或在 FinishedLaunching 终止后以其他形式回调方法。

设备诊断

如果设置调试器时出错,可以通过向“项目选项”中的其他 mtouch 参数添加“-v -v -v”启用详细诊断。 这将打印设备控制台详细的错误信息。

无线调试

Xamarin.iOS 中的默认设置是通过 USB 连接,在设备上调试应用程序。 有时为了开发 ExternalAccessory 驱动的应用程序,可能需要 USB 设备测试电缆的插入/拔出。 在这些情况下,可以通过无线网络进行调试。

有关无线部署和调试的详细信息,请参阅无线部署指南。

技术详细信息

Xamarin.iOS 使用新的 Mono 软调试器。 与标准 Mono 调试器不同,后者是使用操作系统界面控制单独进程的程序,而软调试器则是通过使 Mono 运行时通过网络协议公开调试功能来进行工作。

启动时,要进行调试的应用程序将联系调试器,然后调试器开始运行。 在 Xamarin.iOS for Visual Studio 中,Xamarin Mac Agent 充当应用程序(Visual Studio 中)与调试器之间的中间程序。

在设备上运行时,此软调试器需要协作调试方案。 这意味着调试时二进制文件生成版本将变复杂,因为需要检测代码才能在每个序列点包含额外的代码,以便支持调试。

访问控制台

崩溃日志和控制台类输出将发送到 iPhone 控制台。 可以通过 Xcode 使用“管理器”,然后从管理器选择设备来访问此控制台。

或者,如果不想启动 Xcode,可以使用 Apple 的 iPhone 配置实用程序直接访问控制台。 此操作有额外的好处,如果用户正在域中调试问题,则可从 Windows 计算机访问控制台日志。

对于 Visual Studio 用户,虽然输出窗口中有多个可用日志,但应切换到 Mac 更全面地了解详细日志。


调试 Mono 的类库

Xamarin.iOS 随附用于 Mono 类库的源代码,可使用此代码在调试器中单步执行,查看内部工作原理。

由于此功能在调试过程中会占用更多内存,因此默认禁用。

若要启用此功能,请确保在“Visual Studio for Mac”>“首选项”>“调试程序”菜单下已取消选择“仅调试项目代码;不单步执行框架代码”选项,如下图所示:

Debugging Mono's Class Libraries

一旦执行此操作,便可以启动应用程序并单步执行 Mono 的任何核心类库。