启动主机和内核调试 - 2023.2 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 简体中文
在软件仿真中,为了对硬件加速器进行更有效的建模,FPGA 二进制文件的执行将作为独立进程来生成。如果您正在使用 GDB 来调试主机代码,则不会在内核代码中遇到断点,因为在主机代码进程中不运行内核代码。为了支持主机代码和内核代码的并发调试,Vitis 调试器提供了一个系统,可通过使用调试服务器 (xrt_server) 来连接到生成的内核。要将主机代码和内核代码连接到调试服务器,您必须使用以下进程打开 3 个终端窗口。
提示: 当使用 GDB 图形前端(如 GNU 上提供的数据显示调试器 (DDD))时,此流程也应该能够正常工作。以下步骤是启动 GDB 的说明。
  1. 打开 3 个终端窗口,并按 设置 Vitis 环境 中所述设置每个窗口。这 3 个窗口用于:
    • 运行 xrt_server
    • 在主机代码上运行 GDB (xgdb)
    • 在内核代码上运行 GDB (xgdb)
  2. 在第一个终端中,设置终端环境后,请使用以下命令启动 Vitis 调试服务器:
    xrt_server --sdx-url

    调试服务器会监听来自主机和内核的调试命令、并将 2 个进程相连以创建单一调试环境。xrt_server 会在标准输出上返回 listener port <num>。为了控制该进程,您必须启动新的 GDB 实例,并通过监听器端口连接到 xrt_server。您可通过下列步骤完成此操作。

    提示: 不应连接到初始监听器端口,因为 TCF 代理(例如,Vitis IDE)将该端口用于连接。在此命令行流程中,应忽略第一个监听器端口。
    重要: 运行 xrt_server 后,所有生成的 GDB 进程都会等待您进行控制。如果没有任何 GDB 连接到 xrt_server,或者没有任何 GDB 提供命令,那么内核代码会显示为挂起。
  3. 在第二个终端中,设置终端环境后,请按如下步骤所述为主机代码启动 GDB:
    1. 设置 ENABLE_KERNEL_DEBUG 环境变量。例如,在 C-shell 中使用:
      setenv ENABLE_KERNEL_DEBUG true
    2. XCL_EMULATION_MODE 环境变量设置为 sw_emu 模式,如 在硬件上运行系统 中所述。例如,在 C-shell 中使用:
      setenv XCL_EMULATION_MODE sw_emu
    3. 必须使用 xrt.ini 文件中的条目来启用运行时调试功能,如 xrt.ini 文件 中所述。在主机可执行文件所在的目录中创建 xrt.ini 文件,并包含下列行:
      [Debug]
      app_debug=true
      

      这样即可告知运行时库,内核已编译完成,可用于调试,并且 XRT 库应启用调试功能。

    4. 通过 AMD 封装文件启动 gdb
      xgdb --args <host> <xclbin>
      其中 <host> 是主机可执行文件的名称,<xclbin> 是 FPGA 二进制文件的名称。例如:
      xgdb --args host.exe vadd.xclbin

      xgdb 封装文件启动 GDB 即可为 Vitis 调试器执行以下设置步骤:

      • 随指定的主机程序加载 GDB。
      • 从 GDB 命令提示符处使用 source 命令获取 Python 脚本,以启用 Vitis 调试器扩展:
        gdb> source ${XILINX_XRT}/share/appdebug/appdebug.py

    gdb 中运行主机应用时,它会生成软件仿真进程副本。该软件仿真进程会检测 xrt_server 是否正在运行并与其连接。此时,会创建内核 gdb 的监听器端口,并且软件仿真进程会一直等待直至其收到命令。现在,您应该将内核 gdb 连接到 xrt_server 监听器端口,如下一步中所述。

  4. 在第三个终端中,设置终端环境后,请启动 xgdb 命令并从 (gdb) 提示符处运行以下命令:
    • 对于软件仿真:
      file <Vitis_path>/data/emulation/unified/cpu_em/generic_pcie/model/genericpciemodel

      其中 <Vitis_path>Vitis 核开发套件的安装路径。$XILINX_VITIS 环境变量在 GDB 内不可用。

    • 连接到内核进程:
      target remote :<num>

      其中 <num>xrt_server 返回的监听器端口号。

当全部 3 个终端窗口都运行 xrt_server、用于主机的 GDB 和用于内核的 GDB 后,您即可在自己的主机或内核上按需设置断点、运行 continue 命令并调试自己的应用。当所有内核调用完成后,主机代码将继续,而 xrt_server 连接将断开。