因为需要分析基于RISC-V平台的指令执行情况,开启了Renode仿真器的dump功能和logger功能。Dump功能可以帮助我们借助辅助工具对指令执行情况和memory访问情况等进行可视化图形展示,具体在前面的文章已经介绍过:Renode使用:Metrics analyzer_牧羊女-CSDN博客
Dump功能虽然可以让我们直观地看到指令执行的总体趋势,但是画面上并不提供微观细节(暂时没有找到解析Dump file的工具),想要看到平台内部的执行细节,可以使用log功能。
1. 设置log level
目前Renode支持5个log level,分别为:
- NOISY (-1)
- DEBUG (0)
- INFO (1)
- WARNING (2)
- ERROR (3)
Renode提供了非常灵活的配置策略,可对每个仿真对象分别配置log level,也可以对不同的日志记录器(控制台或log文件)分别配置不同的log level。
默认情况下,Renode输出DEBUG level以上的log信息,如果要对所有log打开NOISY输出,可通过执行下面语句实现:
(machine-0) logLevel -1
如果想要对特定的外设改变log level,例如将UART的log level设置为NOISY,则通过下面命令实现:
(machine-0) logLevel -1 sysbus.uart
如果想要查看当前的log level信息,输入命令logLevel即可:
2. 输出到log file
以上输出中,可以看到"Backend"一栏有"file"项,这是因为在仿真中启用了log file输出。Renode的log默认是输出在控制台的,但是对于需要长时间运行的仿真,打印到日志文件里面会更加方便后期分析。
可通过如下命令启用log file的输出:
(machine-0) logFile @some_file_name
其中,"@some_file_name"就是我们要输出的log file的文件名,含路径。需要注意的是,打开log file后,原本输出到控制台的log并不会中断,而是两者同时输出(开发过log功能的同学大概会记得multi-sink的概念),但控制台和file可以分别设置log策略,比如log level等等。
例如,我们要把log file的level设置为ERROR级别,则可执行如下语句:
(machine-0) logLevel 2 file
要在log file中设置uart输出级别为INFO,则命令如下:
(machine-0) logLevel 1 file sysbus.uart
3. 使能外设访问日志
除了以上的常规日志配置,Renode还提供了对特定外设的访问日志,可以输出对注册在系统总线上的所有外设的访问记录。
例如,以下命令可开启对UART的访问记录:
(machine-0) sysbus LogPeripheralAccess sysbus.uart
每当有数据访问,便会输出类似如下的记录:
14:32:28.6083 [INFO] uart: ReadByte from 0x0 (TransmitData), returned 0x0.
若要开启对所有外设的访问日志,可执行如下命令:
(machine-0) sysbus LogAllPeripheralsAccesses true
开启后,会打印所有外设访问信息。
4. 跟踪函数执行
Renode还提供了跟踪函数执行的机制,可通过如下语句开启:
(machine-0) sysbus.cpu LogFunctionNames True //开启所有函数执行的记录
(machine-0) sysbus.cpu LogFunctionNames True "xyz abc" //开启以"xyz"和"abc"为前缀的函数的记录
但似乎该功能设计并不够完善,只能输出函数名称及指令地址,并不能很直观地看到具体的指令类型。