存储器访问违例和 Valgrind - 2023.2 简体中文

AI 引擎工具和流程用户指南 (UG1076)

Document ID
UG1076
Release Date
2023-12-04
Version
2023.2 简体中文

当内核在对象界外执行读取或写入或者读取未初始化的存储器时,可能发生存储器访问违例。这种违例可能以多种方式显现,例如,仿真器崩溃或挂起。它还可能导致仿真器结果不可重复。x86simulator --valgrind 选项将在内核源代码中查找存储器访问违例。

注释: 要使该功能特性正常工作,需安装 Valgrind。AMD 建议使用 Valgrind v3.16.1 和更高版本。

该选项允许在 x86 仿真期间使用 Valgrind 检测内核源代码中的存储器访问违例。可检测到的访问违例类型如下。

  • 出界写入
  • 出界读取
  • 读取未初始化的存储器

该选项有两种使用方法:

x86simulator --valgrind
开启访问违例检测的前提下运行仿真。仿真结束时,Valgrind 会打印有关访问违例的报告。如无违例,那么报告会以“ERROR SUMMARY: 0 errors from 0 contexts”结尾。否则,报告会列出找到的每一项访问违例。这其中包括栈追踪,即高亮内核源代码中发生访问违例的位置对应的行号。
x86simulator --valgrind-gdb
开启访问违例检测的前提下运行仿真,并以 GDB 进行调试。仿真会显示在 GDB 中并在 main() 处中止。此时您可设置额外断点。继续后,如果检测到访问违例,仿真将会停止。此时,您可检验局部变量和栈,以便诊断问题。

无论在上述任何情况下,均可使用 flag --valgrind-args='list of arguments for valgrind' 向 Valgrind 命令添加部分实参。例如:

--valgrind-args='-v --leak-check=no --track-origins=yes'

这样将不会跟踪存储器泄漏,并且发现访问违例时将显示整个栈。

注释: 运行 x86simulator 并搭配 Valgrind 选项将增加仿真运行时间。