在软件仿真中,为了对硬件加速器进行更有效的建模,FPGA 二进制文件的执行将作为独立进程来生成。如果您正在使用 GDB 来调试主机代码,则不会在内核代码中遇到断点,因为在主机代码进程中不运行内核代码。为了支持主机代码和内核代码的并发调试,Vitis 调试器提供了一个系统,可通过使用调试服务器 (
xrt_server
) 来连接到生成的内核。要将主机代码和内核代码连接到调试服务器,您必须使用以下进程打开 3 个终端窗口。 提示: 当使用 GDB 图形前端(如 GNU 上提供的数据显示调试器 (DDD))时,此流程也应该能够正常工作。以下步骤是启动 GDB 的说明。
- 打开 3 个终端窗口,并按 设置 Vitis 环境 中所述设置每个窗口。这 3 个窗口用于:
- 运行
xrt_server
- 在主机代码上运行 GDB (
xgdb
) - 在内核代码上运行 GDB (
xgdb
)
- 运行
- 在第一个终端中,设置终端环境后,请使用以下命令启动 Vitis 调试服务器:
xrt_server --sdx-url
调试服务器会监听来自主机和内核的调试命令、并将 2 个进程相连以创建单一调试环境。
xrt_server
会在标准输出上返回listener port <num>
。为了控制该进程,您必须启动新的 GDB 实例,并通过监听器端口连接到xrt_server
。您可通过下列步骤完成此操作。提示: 不应连接到初始监听器端口,因为 TCF 代理(例如,Vitis IDE)将该端口用于连接。在此命令行流程中,应忽略第一个监听器端口。重要: 运行xrt_server
后,所有生成的 GDB 进程都会等待您进行控制。如果没有任何 GDB 连接到xrt_server
,或者没有任何 GDB 提供命令,那么内核代码会显示为挂起。 - 在第二个终端中,设置终端环境后,请按如下步骤所述为主机代码启动 GDB:
- 设置
ENABLE_KERNEL_DEBUG
环境变量。例如,在 C-shell 中使用:setenv ENABLE_KERNEL_DEBUG true
- 将
XCL_EMULATION_MODE
环境变量设置为sw_emu
模式,如 在硬件上运行系统 中所述。例如,在 C-shell 中使用:setenv XCL_EMULATION_MODE sw_emu
- 必须使用 xrt.ini 文件中的条目来启用运行时调试功能,如 xrt.ini 文件 中所述。在主机可执行文件所在的目录中创建 xrt.ini 文件,并包含下列行:
[Debug] app_debug=true
这样即可告知运行时库,内核已编译完成,可用于调试,并且 XRT 库应启用调试功能。
- 通过 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
监听器端口,如下一步中所述。 - 设置
- 在第三个终端中,设置终端环境后,请启动
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
连接将断开。