Renode中Logger的使用

因为需要分析基于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"为前缀的函数的记录

但似乎该功能设计并不够完善,只能输出函数名称及指令地址,并不能很直观地看到具体的指令类型。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
详细分析以下代码#include<iostream> #include<cstring> #include<cmath> using namespace std; int Node[50]; int number; int Calculate(char x)//计算偏移 { if(x>=97&&x<=122) return 0; switch(x) { case '!': case '^': case '(': case ')': return 1; case '|': case '-': return 2; case '<': return 3; default: return 1; } } int CalculateOut(string &Word,int n,int m)//输出||、->、<->,等等 { int i; if(m!=0) { for(i=1; i<m; i++)cout<<Word[n+i]; if(Word[i+n]!='\0') cout<<" "; } } int Input(string &Word)//输出数据 { int m,i,tag,q; number=0; for(i=0; Word[i]!='\0'; ) { q=i; if(Word[i]==' ') { i++; continue; } cout<<Word[i]; tag=Calculate(Word[i]); CalculateOut(Word,i,tag); i+=tag;//偏移 if(!tag)//数字计数 { Node[Word[q]-97]++; number++; if(Word[i+1]!='\0') cout<<" "; i++; } } cout<<endl; return number; } int Bin(int n,int m) { int bin[10000]; int a,b,i=0; do { a=n%2; n/=2; bin[i++]=a; } while(n>0); for(n=0; n<m-i; n++) { cout<<"0 "; } for(n=i-1; n>=0; n--) { cout<<bin[n]; if(n) cout<<" "; } } int Outnumber(int n) { int i,m=1; for(i=1; i<n; i++) { m=m*2+1; } for(i=m; i>=0; i--) { Bin(i,n); cout<<endl; } } void CoutNode() { int i,temp=0; for(i=0; i<50; i++) { if(temp==0&&Node[i]!=0) { cout.put(97+i); temp++; } else if(Node[i]!=0) { cout<<" "; cout.put(97+i); temp++; } } number=temp; cout<<endl; } int ReNode()//初始化 { for(int i=0; i<110; i++) Node[i]=0; } int Turn(char Map[400],string &Word) { int n,i; for(i=0,n=0;i<=strlen(Map);i++) { if(Map[i]!=' ') { Word[n]=Map[i]; n++; } } Word[n]='\0'; } int main() { int n,i; string Word; char Map[400]; while(gets(Map)!=NULL)//输入 { ReNode(); Turn(Map,Word); Input(Word); CoutNode(); Outnumber(number); } // Bin(2); }
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值