Vitis IDE 调试环境具有诸多基于 GUI 的传统调试环境内常见的功能特性,例如 GDB。您可在代码中添加断点、单步跳过或单步进入代码、循环或函数的特定行、检验变量状态并将其强制设为特定值。这些只是 Vitis IDE 调试环境中的一小部分功能特性。
启动Debug(调试)透视图后,您将看到其中显示的多个窗口或视图,例如,显示在右上角的Debug视图,如下图所示。调试进程期间,有多个窗口会显示调试状态,包括调用栈、位于断点处的代码、单步跳过状态、断点视图、变量视图、寄存器视图、反汇编视图和流水线视图。
Debug视图会显示所调试的核的状态。它会显示调试器停止的位置(包括哪个文件和文件的哪一行源代码),及其采取的行动(断点、单步跳过等),如下图所示。
图 1. “Debug”视图
下图显示了Breakpoints(断点)信息,包含当前设置断点。打勾的方块表示此断点已启用。单击复选标记即可将其清除并在调试期间禁用断点。这样您即可管理断点,而无需移除断点或者将其重新添加回代码中。
图 2. “Breakpoint”视图
重要: 对 AI 引擎仿真器或者协同仿真进行调试时,每个 AI 引擎拼块都支持 4 个断点。TCF 框架默认会在 AI 引擎内核
main()
处停止。连接到 while
语句的断点会耗用两个断点资源。变通方法是将断点附加到 while
循环内部。这样仅耗用一个断点。在源码级调试器中,您可以追踪分配给存储器或寄存器的源码变量。其位置和内容均可可视化。但启用所有最优化时,无法直接执行源码变量追踪:
- 局部标量变量通常驻留在寄存器内,通常执行过程中在不同时间点追踪不同变量。
- 分配给存储器的变量并不总是会直接更新。例如,在循环前,可在寄存器中加载全局变量。然后在循环内即可在寄存器中对该变量进行操作,或者在循环后仅将其重新存储到存储器中。这称为最优化冗余存储移除。
- 同样,如果单一源码行的代码分散在最终对象代码中,那么单步执行源代码会变得困难。