目录
官网教程:gem5: Debugging gem5
本来想直接写下一小节《Event-driven programming》,但为了按照官网教程顺序,趁着周末时间,额外多写一篇吧。
一、使用调试标识符--debug-flags
1、--debug-flags=DRAM
举个比较简单的例子:
build/X86/gem5.debug --debug-flags=DRAM configs/learning_gem5/part1/simple.py | head -n 50
- 其中--debug-flags=DRAM是启用DRAM调试的标志,即输出和DRAM相关的调试信息,可能包括对内存访问的跟踪、缓存行的命中或者失效等。
-
head -n 50
的目的是限制输出行数,以便只显示前 50 行的调试输出。
2、--debug-flags=Exec
build/X86/gem5.debug --debug-flags=Exec configs/learning_gem5/part1/simple.py | head -n 50
其中--debug-flags=Exec,将输出与执行(execution)相关的调试信息,如模拟 CPU 如何执行每条指令的详细信息、函数调用和返回的跟踪。
3、输出所有调试信息
build/X86/gem5.debug --debug-help
二、新增新的调试标识符--debug-flags
1、在SConscript文件中声明debug-flags
在这里是声明了一个名为HelloFlag的调试标识符,其中DebugFlag()的第二个参数是对HelloFlag的解释说明。
2、hello_object.cc中引入头文件
在类的实现文件中导入刚刚声明的debug-flag的头文件。
#include "base/trace.hh"
#include "debug/HelloExample.hh"
3、hello_object.cc中修改输出
DPRINTF(HelloExample, "Created the hello object\n");
4、rebuild gem5.debug
scons build/X86/gem5.debug
5、测试
build/X86/gem5.opt --debug-flags=HelloExample configs/learning_gem5/part2/run_hello.py
【说明】:之所以我运行的是hello_goodbye.py,是因为我在进行下一小节学习时将这部分文件修改了(新增了goodbye类),这里只展示debug-flag的输出效果如图上。
三、除DPRINTF外的调试函数
其他调试函数的参考文档
gem5: base/trace.hh File Reference
- 前面提到的:cppDDUMP、:cppDPRINTF 和 :cppDPRINTFR接受一个调试标志作为参数,该标志在代码中指示是否启用调试输出。这样,可以根据需要选择性地打印调试信息。
- gem5 提供了一些类似的函数,它们不接受标志作为参数。这意味着,只要调试功能被启用,这些函数将始终打印输出,而无需考虑标志的设置。
- 同时,为了使用这些调试函数,必须以 "opt" 或 "debug" 模式编译 gem5。其他模式将使用空占位符宏来替代这些函数。