首页 > 其他分享 >Debug GEM5

Debug GEM5

时间:2024-10-10 15:47:29浏览次数:1  
标签:GEM5 gem5 -- debug HelloExample Debug DPRINTF 调试

Debugging gem5

原英文版在https://www.gem5.org/documentation/learning_gem5/part2/debugging

Using debug flags

调试标志用于debug。通常在gem5,不能使用 std::cout,而应借助调试标志进行输出。

gem5通过可选的调试标志(--debug-flag)提供printf风格的跟踪/调试支持。

--debug-help可获取调试标志说明(启用多种调试标志用逗号隔开)。

下面以Exec介绍一个例子

build/RISCV/gem5.opt --debug-flags=Exec configs/learning_gem5/part1/simple-riscv.py | head -n 50

Exec本身就是很多调试标志的集合

因为,debug输出信息很多,所以这里只取前面一部分

image-20241010135630759

Adding a new debug flag

  1. 创建新调试标记时,我们首先要在 SConscript 文件中声明它。 将以下内容添加到包含 hello 对象代码的目录(src/learning_gem5/SConscript中)。

    DebugFlag('HelloExample')
    
  2. 通过在 SConscript 文件中声明调试标志,调试头文件会自动生成,允许我们使用调试标志。头文件在./build/{ISA}/debug/HelloExample.hh调试目录中,其名称(和大小写)与我们在 SConscript 文件中声明的名称相同。 因此,我们需要在任何计划使用调试标记的文件中包含自动生成的头文件。(记得修改后要重新构建一下scons build/X86/gem5.opt

    #include "base/trace.hh"
    #include "debug/HelloExample.hh"
    
  3. 通过宏DPRINTF使用

    DPRINTF(HelloExample, "Created the hello object\n");
    

    这里需要解释一下DPRINTF,宏展开如下。每次执行动态 DPRINTF 时,都会向 stdout 打印三项内容。 第一,执行 DPRINTF 时的当前刻度curTick()。 第二,调用 DPRINTF 的模拟对象的名称name()。 该名称通常是 Python 配置文件中实例的名字,即SimObject name() 函数返回的名称。 第三,是传递给 DPRINTF 函数的格式字符串

    #define DPRINTF(x,__VA_ARGS__...) do { if (GEM5_UNLIKELY(TRACING_ON && ::gem5::debug::x)) { ::gem5::trace::getDebugLogger()->dprintf_flag( ::gem5::curTick(), name(), #x, __VA_ARGS__); } } while (0)
    扩展到:
    do { if (__builtin_expect(!!(TRACING_ON && ::gem5::debug::HelloExample), 0)) { ::gem5::trace::getDebugLogger()->dprintf_flag( ::gem5::curTick(), name(), "HelloExample", "Created the hello object\n"); } } while (0)
    

Debug output

默认情况下,所有调试输出都打印到 stdout。 也可以使用--debug-file 参数控制调试输出的位置,比如用以下命令

build/X86/gem5.opt --debug-flags=HelloExample --debug-file debug.txt  xxx.py

输出会重定向到./m5out/debug.txt中。

Using functions other than DPRINTF

DPRINTF是最常用的。此外gem5还有其他调试功能,参考见https://doxygen.gem5.org/release/current/base_2trace_8hh.html

这些函数与之前的 :cppDDUMP、:cppDPRINTF 和 :cppDPRINTFR 函数类似,只是它们不将标志作为参数。所有这些函数只有在以 "opt"或 "debug"模式编译 gem5 时才会启用。 所有其他模式都为上述函数使用空占位符宏,因此,如果要使用调试标记,必须使用 "gem5.opt "或 "gem5.debug"

标签:GEM5,gem5,--,debug,HelloExample,Debug,DPRINTF,调试
From: https://www.cnblogs.com/HiDark/p/18456494

相关文章

  • 今天终于解决lazarus debug模式为GDB时中文变量显示出错的问题
    之前已修复fpdebug中文变量的Bug,但GDB还存在问题(提示:Invalidcharacterxxxxinexpression)修复步骤:打开lazarus/components/lazdebuggergdbmi/gdbmidebugger.pp,按红色代码修改。在TGDBMIExceptionInfo=record后添加functionischinese(s:string):string(1790行):TGD......
  • Debuggers 1012:Introductory GDB
    OpenSecurityTraining2LearningPaths:VulnerabilityHunting&Exploitationpython:https://www.learnpython.org/路径图:https://ost2.fyi/OST2_LP_Vulns_Exploits.pdfDebuggers1012:IntroductoryGDB(与python)-->Architecture1001:x86-64Assembly-->R......
  • python多进程debug
    代码调试问题阐述最近遇到一个pythondebug多进程的问题有一个进程A,这个进程会fork出8个进程B,forkjoin结束后,又会fork出8个进程A。假设按时间有序,我就只想断fork出的第一个B和第一个进程A,怎么做?(breakpointjustbreakonlyonce)类似于java多线程调试的意思,只断一个线程,all-......
  • Android Debug Bridge(ADB)完全指南
    文章目录前言一、什么是ADB?二、ADB的工作原理ADB由三个部分组成:三、如何安装ADBWindows系统:macOS和Linux系统:四、ADB常用指令大全设备相关操作1.查看连接的设备:2.重启设备:3.进入Bootloader模式:4.进入恢复模式(Recovery):5.查看设备运行状态:6.获取设备的序列号:7.查......
  • android开发Execution failed for task ':bundleDebugAar'...Direct local .aar file
    1.问题描述[+103ms]FAILURE:Buildfailedwithanexception.[]*Whatwentwrong:[]Executionfailedfortask':jpush_flutter:bundleDebugAar'.[]>Errorwhileevaluatingproperty'hasLocalAarDeps'oftask......
  • linux gdb debuging
    GDBGNU下的一个调试软件,在linux下可以用来调试c/c++代码。启动可以通过gdb--help查看用法,如下:ThisistheGNUdebugger.Usage:gdb[options][executable-file[core-fileorprocess-id]]gdb[options]--argsexecutable-file[inferior-arguments...]gdb[optio......
  • VS控制台出现debug()乱码问题
    出现的问题之前项目debug()控制台打印正常,增删后发现只有debug()将强转到QString::fromLocal8Bit才可以显示出来,VS控制台或调试器默认使用UTF-8解码,我通过cmd控制台查看自身活动代码为936(简体中文的GBK编码)因此不兼容有两种方法,我用的是第二种,建议第二种方法一:在控制台中......
  • /sys/kernel/debug/binder/目录下主要节点含义
    /sys/kernel/debug/binder/目录下主要节点含义state显示binder设备的整体状态信息包括进程数量、线程数量、待处理事务数量等stats展示binder操作的统计信息如事务数量、内存使用情况等transactions列出当前正在处理的binder事务包括发送方、接收方、数据大小......
  • 嵌入式的核心能力-Debug调试能力(一)
    一、栈回溯引入:调试程序时,经常会发生这类错误:读写某个地址,程序报错;调用某个空函数,导致程序报错等等。解决方法是,可以利用异常处理函数去打印出“发生错误瞬间”的所有寄存器地址根据这些打印出来的地址信息,回溯发生错误的位置,并且需要知道位于调用链路。1.栈回溯的原理本......
  • 如何高效debug[转载]
    近来,经常因为一个小bug调试1-2个小时,甚至调试一整天的情况,都有!我也在网上找了一点这方面文章来看.觉得还是国外的写的要比中国的好一点.没别的意思,摘录在下面https://www.cnblogs.com/BEMAKE/p/16502574.html六、注释法如果你实在没有思路,那可以采用注释法来排查。所谓的注释......