调试合作伙伴应用程序

  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 的输出。

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

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

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

打开反汇编视图:

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

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

    az sphere 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 上运行,请将“targets io0”替换为“targets 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 嵌入式工具链的一部分:

    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. (Windows) 或终端窗口 (Linux) 打开新的 Azure Sphere 命令提示符。

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

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

    az sphere device app stop --component-id <ComponentId>
    
    az sphere 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 集,如 应用程序运行时版本、sysroots 和 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