调试合作伙伴应用程序

重要

这是 Azure Sphere(旧版)文档。 Azure Sphere(旧版)将于 2027 年 9 月 27 日停用,用户此时必须迁移到 Azure Sphere(集成)。 使用位于 TOC 上方的版本选择器查看 Azure Sphere(集成)文档。

  1. 确保通过 USB 将设备连接到电脑。 在“设置启动项”菜单中,选择 Azure Sphere 应用(所有核心),其中 Azure Sphere 应用是顶级项目的名称或按 F5

    远程 GDB 调试程序按钮

  2. 如果系统提示你生成项目,请选择“是”。 Visual Studio 编译合作伙伴应用程序,创建映像包, 将其旁加载 到开发板上,并在调试模式下启动它们。 旁加载 意味着应用程序通过有线连接直接从电脑交付,而不是通过云传送。

    请注意“视图>输出>显示输出”中的路径:生成输出,指示输出包在电脑上的位置。 准备好创建部署时,需要知道映像包的路径。

  3. 默认情况下,“输出”窗口显示设备输出的输出。 若要查看调试程序中的消息,请从“显示输出来源:”下拉菜单中选择“调试”。 也可通过“调试”>“Windows”菜单检查程序反汇编、寄存器或内存。

如果有两个 RTApp,请确保这两者在 顶级launch.vs.json文件中都列为合作伙伴应用。

使用 Visual Studio 调试器设置断点、暂停、单步执行、单步执行、单步执行、重启或停止应用程序。

在 C 源代码中的断点处停止时,可以打开一个 反汇编 窗口 ,显示当前地址、当前命令的汇编程序助记符,以及涉及的寄存器或正在执行的源代码命令等信息。

打开反汇编窗口:

  1. 确保 Visual Studio 中打开包含断点的 C 代码源文件。
  2. 选择“调试>Windows>反汇编”,或按 Alt+8。
  1. 打开包含合作伙伴应用程序的文件夹。 Visual Studio Code 会检测工作区文件,并询问是否要打开工作区。 选择“打开工作区”可同时打开实时应用程序和高级应用程序。

  2. 右键单击两个CMakeLists.txt文件之一,然后选择“ 生成所有项目”。

  3. 单击 Visual Studio Code 活动栏中的“运行”图标。

  4. 在屏幕左侧窗口顶部显示的下拉菜单上,选择“启动 Azure Sphere 应用”(gdb)(工作区)。

  5. 按 F5 生成和调试项目。 如果项目以前尚未生成,或者文件已更改并重新生成,Visual Studio Code 将在调试开始之前生成项目。

  6. 等待几秒钟,Visual Studio Code 生成应用程序、创建映像包、将其部署到开发板,并在调试模式下启动它们。 在此过程中, 你将在“输出 ”窗格中看到状态更新。

    首先,CMake 确定是否需要生成应用程序。 如果是这样,焦点将移动到输出窗口,该窗口显示 CMake/Build 的输出。

    接下来,输出窗格显示 azsphere 的输出,因为它将映像包部署到设备。 最后,调试控制台接收焦点并显示 gdb 输出。

使用 Visual Studio Code 调试器设置断点、暂停、单步执行、单步执行、重启或停止应用程序。

在 C 源代码中的断点处停止时,可以打开一个反汇编视图,该视图显示当前地址、原始十六进制数据、当前命令的汇编程序助记,以及涉及的寄存器或正在执行的源代码命令等信息。

打开反汇编视图:

  1. 确保在 Visual Studio Code 编辑器中打开包含断点的 C 代码源文件。
  2. 在编辑器窗口中右键单击并选择“打开反汇编视图”,或选择“视图>命令面板>打开反汇编视图”。
  1. 如果正在运行,请停止支持实时的应用程序。

    azsphere device app stop --component-id <component id>
    
  2. 使用调试重新启动支持实时的应用程序。

    azsphere device app start --component-id <component id>
    

    此命令返回应用程序正在其上运行的内核。

      <component id>
      App state   : running
      Core        : Real time 0
    
  3. 导航到生成应用程序所用的 sysroot 的 Openocd 文件夹。 sysroot 安装在 Azure Sphere SDK 安装文件夹中。 例如,在 Windows 上,该文件夹默认安装在 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Sysroots\*sysroot*\tools\openocd,而在 Linux 上安装在 /opt/azurespheresdk/Sysroots/*sysroot*/tools/sysroots/x86_64-pokysdk-linux

  4. 如下面的示例所示,运行 openocd。 该示例假定应用在内核 0 上运行。 如果应用在内核 1 上运行,请将“目标 io0”替换为“目标 io1”。

    openocd -f mt3620-rdb-ftdi.cfg -f mt3620-io0.cfg -c "gdb_memory_map disable" -c "gdb_breakpoint_override hard" -c init -c "targets io0" -c halt -c "targets"
    
  5. 使用 PowerShell、Windows 命令提示符或 Linux 命令行界面打开命令行界面。

  6. 导航到包含支持实时的应用程序 .out 文件的文件夹并启动 arm-none-eabi-gdb,这是 GNU Arm Embedded 工具链的一部分:

    Windows 命令提示符

    "C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin\arm-none-eabi-gdb" IntercoreComms_RTApp_MT3620_BareMetal.out
    

    Windows PowerShell

    & "C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin\arm-none-eabi-gdb" IntercoreComms_RTApp_MT3620_BareMetal.out
    
  7. OpenOCD 服务器在 :4444 上提供 GDB 服务器接口。 设置目标进行调试。

    target remote :4444

  8. 现在可以运行 gdb 命令。 在函数 HandleSendTimerDeferred 中添加断点:

    break HandleSendTimerDeferred

  9. 连接的终端模拟器应显示支持实时的应用程序的输出。

  10. 打开新的 Azure Sphere 命令提示符(Windows)或终端窗口(Linux)。

  11. 导航到包含高级应用程序 .imagepackage 文件的文件夹。

  12. 如果应用程序正在运行,请停止它,然后使用调试重新启动它:

    azsphere device app stop --component-id <ComponentId>
    
    azsphere device app start --debug-mode --component-id <ComponentId>
    
  13. 打开终端模拟器,并在端口 2342 上建立到 192.168.35.2 的 Telnet 或 TCP 连接,以查看高级应用的输出。

  14. 使用以下命令启动 gdb:

    Windows 命令提示符

    "C:\Program Files (x86)\Microsoft Azure Sphere SDK\Sysroots\*sysroot*\tools\gcc\arm-poky-linux-musleabi-gdb.exe" IntercoreComms_HighLevelApp.out
    

    Windows PowerShell

    & "C:\Program Files (x86)\Microsoft Azure Sphere SDK\Sysroots\*sysroot*\tools\gcc\arm-poky-linux-musleabi-gdb.exe" IntercoreComms_HighLevelApp.out
    

    注意

    Azure Sphere SDK 附带了多个 sysroot,以便应用程序可以面向不同的 API 集,如应用程序运行时版本、sysroot 和 Beta API 中所述。 sysroot 安装在 Sysroots 下的 Azure Sphere SDK 安装文件夹中

  15. 将远程调试目标设置为端口 2345 上的 IP 地址 192.168.35.2:

    target remote 192.168.35.2:2345
    
  16. 在函数 SendMessageToRTApp 中添加断点:

    break SendMessageToRTApp
    
  17. 键入 c 继续,观察 Telnet/TCP 终端中的输出,然后切换到包含实时应用程序调试会话的命令提示符或终端窗口。

  18. 键入 c 以继续并观察连接的串行会话中的输出。

可以在调试会话之间来回工作,在支持实时的应用程序与高级应用程序之间进行切换。 应在两个输出窗口中看到类似于以下内容的输出:

Starting debugger....
                     Process /mnt/apps/25025d2c-66da-4448-bae1-ac26fcdd3627/bin/app created; pid = 40
                     Listening on port 2345
                                           Remote debugging from host 192.168.35.1, port 56522
              High-level intercore comms application
                                                    Sends data to, and receives data from a real-time capable application.
                                          Sending: hl-app-to-rt-app-00
                                                                      Sending: hl-app-to-rt-app-01
IntercoreComms_RTApp_MT3620_BareMetal
App built on: Nov 17 2020, 09:25:19
Sender: 25025d2c-66da-4448-bae1-ac26fcdd3627
Message size: 19 bytes:
Hex: 68:6c:2d:61:70:70:2d:74:6f:2d:72:74:2d:61:70:70:2d:30:30
Text: hl-app-to-rt-app-00

若要结束每个调试会话,请在 gdb 提示符处键入 q