vscode 配置代码跳转和调试
vscode 配置Gem5代码跳转
方法一
首先需要CMakeLists.txt, 放入gem5顶层目录
cmake_minimum_required(VERSION 2.8.13)
project(gem5)
#Bring the headers, such as Student.h into the project
FIND_PACKAGE( Boost 1.6 )
include_directories(${Boost_INCLUDE_DIRS})
include_directories(src)
include_directories(build/RISCV)
include_directories(ext/softfloat)
#Can manually add the sources using the set command as follows:
#set(SOURCES src/mainapp.cpp src/Student.cpp)
#However, the file(GLOB...) allows for wildcard additions:
file(GLOB_RECURSE cpu_sources src/cpu/*.cc src/cpu/*.hh)
file(GLOB_RECURSE pred_sources src/cpu/pred/*.cc src/cpu/pred/*.hh)
file(GLOB_RECURSE ff_sources src/cpu/forwardflow/*.cc src/cpu/forwardflow/*.hh)
file(GLOB arch_sources src/arch/*.cc src/arch/*.hh)
file(GLOB_RECURSE rv_sources src/arch/riscv/*.cc src/arch/riscv/*.hh)
file(GLOB_RECURSE softfloat_sources ext/softfloat/*.c ext/softfloat/*.h)
file(GLOB_RECURSE other_sources
src/base/*.cc src/base/*.hh
src/mem/*.cc src/mem/*.hh
src/sim/*.cc src/sim/*.hh
)
file(GLOB_RECURSE build_sources
build/RISCV/enums/*.cc build/RISCV/enums/*.hh
build/RISCV/config/*.cc build/RISCV/config/*.hh
build/RISCV/params/*.cc build/RISCV/params/*.hh
build/RISCV/debug/*.cc build/RISCV/debug/*.hh
build/RISCV/proto/*.cc build/RISCV/proto/*.hh build/RISCV/proto/*.h
)
set(sources ${cpu_sources} ${arch_sources} ${rv_sources}
${softfloat_sources}
${other_sources} ${build_sources}
${pred_sources} ${ff_sources})
add_definitions(-DTRACING_ON=true)
add_compile_definitions(__CLION_CODING__)
add_executable(gem5 ${sources})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
然后安装cmake, cmake tools 这两个vscode 插件
ctrl+shift+p 输入 show cmake,会要求配置Gcc 路径,选择自己的x86 gcc 就行
确认识别到了CMakeLists.txt, 没有识别就重启vscode, 然后点击重新配置

最后会在build 目录 下生成compile_commands.json(也就是所有c++文件编译关系)
注意,这个CMakeLists.txt 描述了构建关系,但是不用于构建,仍然用scons 来构建。
最后安装clangd 插件(clangd 是c++ language server, 读取json文件生成索引,来跳转)

报错:它的意思是不用默认c++插件intelliSence 跳转,用clangd 跳转,这是合理的
理论上讲安装clangd后C++插件的intellisence会自动被忽视,但有时候还是会与clangd冲突导致代码跳转失效,这时候可以打开setting.json(ctrl+shift+p 输入 Open User Settings(JSON)),然后加上这行:
这样就可以使用clangd的跳转,同时使用C++插件的调试界面了
ctrl+shift+p : clangd: restart language server

确认clangd 正确加载json 文件,并且底部开始索引,说明正确配置了,可以开始愉快的c++ 代码跳转了!

gem5 python 代码跳转还有待优化
方法二
直接用scons 自带的方法来生成compile_commands.json
目前还只在dev-btb-rebase 分支上,等之后会合入主线(目前已合入主线)
# 正常编译一次gem5
scons build/RISCV/gem5.opt --gold-linker -j100
# 生成数据库文件
scons build/RISCV/compile_commands.json
du -sh build/RISCV/compile_commands.json
55M build/RISCV/compile_commands.json # 生成文件很大
# 软链接到主目录,方便clangd 找到
ln -s build/RISCV/compile_commands.json .
# clangd: restart language server 即可
同样按照方法一:安装clangd 来生成索引就好。
这个生成的跳转回默认跳转到build/RISCV/ 下的文件,本质是src 文件中的符号链接文件,每次返回去找原本文件会比较麻烦,可以安装vscode Symlink Follow插件,当打开符号链接文件时候,能提示是否自动跳转到源文件。这个插件每次跳转都跳出弹窗问是否跳转过去,点开插件设置勾选第一个选项就可以默认跳转了。

方法三
使用 bear 来直接生成 compile_commands.json
最后,安利下cursor 编辑器,https://www.cursor.com/, 比vscode 更加好用
vscode 配置内置gdb
安装c/c++ 插件
在gem5 根目录创建.vscode/launch.json 文件
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/RISCV/gem5.debug",
"args": [
"--debug-break=569430",
"--debug-flags=DecoupleBP",
"${workspaceFolder}/configs/example/kmhv3.py",
// 若需要理想化模型:将上一行脚本替换为 "${workspaceFolder}/configs/example/idealkmhv3.py"
"--raw-cpt",
"--generic-rv-cpt=/nfs/home/yanyue/tools/nexus-am-xs/tests/cputest/build/brnum2-riscv64-xs.bin",
],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
},
{ // 默认输出为16进制,可以不用
"description": "设置输出为16进制",
"text": "set output-radix 16",
"ignoreFailures": true
}
]
}
]
}
通过修改args 中的参数就能运行对应的gem5 命令
如果需要某些环境变量,建议放到.zshrc/ .bashrc 中,这样vscode 启动gdb 时候会默认读取这些环境变量
然后在fetch::tick() 设置一个断点

按下F5, 或者下面启动gdb

如果需要输入gdb 命令,在下面的调试控制台,添加-exec 前缀来输入gdb 命令

就可以愉快的调试了