当前位置: 首页 > news >正文

基于 clangd 搭建 Redis 6.2 源码阅读与调试环境

文章目录

  • 一、前言
  • 二、编译准备与工具安装
    • 2.1 获取Redis 6.2 源码
    • 2.2 工具安装
    • 2.3 编译
    • 2.4 VSCode 调试环境配置
  • 三、启动调试

一、前言

Redis 是用 C 语言实现的项目,想要深入阅读和理解其源码,必须先完成源码编译、调试环境配置以及代码跳转功能的准备。

二、编译准备与工具安装

2.1 获取Redis 6.2 源码

# 克隆 Redis 源
git clone https://github.com/redis/redis.git -b 6.2
cd redis-6.2# 编译 Redis
make# 运行测试(可选,不进行测试,容易出错)
# make test# 安装到系统目录
sudo make install

2.2 工具安装

编译源码需先安装 bearclangd 两个核心工具,前者用于生成编译信息文件,后者配合 VSCode 实现源码解析与跳转。

工具 1:bear

bear 的作用是在编译过程中记录编译命令,生成 compile_commands.json 文件(后续 clangd 需依赖该文件解析源码)。安装命令如下:

sudo apt install bear

工具 2:clangd

clangd 是一款 C/C++ 语言的代码补全、跳转工具,需同时安装 “VSCode 前端插件” 和 “系统后端程序”,且需指定版本并设为默认。

  1. 打开 VSCode → 按 Ctrl+Shift+X 打开 “扩展” 面板 → 搜索 “clangd” → 选择作者为 “LLVM” 的插件(图标是蓝色的 “clangd” 字样)→ 点击 “安装”。

  2. 安装指定版本的 clangd 后端(以 clangd-12 为例,也可选择 14、15 等版本):

    sudo apt-get install clangd-12
    
  3. 将安装的版本设为系统默认 clangd

    sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-12 100
    
  4. 验证安装:执行 clangd --version,如果输出版本信息(如 clangd version 12.0.0),则说明安装成功。

注意: 禁用冲突的 VSCode 扩展

VSCode 自带的 “C/C++” 扩展(作者是 Microsoft)可能会和 clangd 冲突。

禁用 IntelliSense 功能:
如果还想保留微软插件用于调试,但只让 clangd 管理语法高亮:

  1. 打开 VSCode 设置(Ctrl+,)
  2. 搜索 “C_Cpp.intelliSenseEngine”
  3. 设置为 "disabled"
    (或者在 .vscode/settings.json 里加上)
{"C_Cpp.intelliSenseEngine": "disabled","C_Cpp.errorSquiggles": "disabled"
}

重启 vscode,这样微软插件不再解析代码(也不会报红),clangd 完全负责语法分析。

2.3 编译

进入 Redis 源码根目录下执行

cd redis-6.2
make clean
bear make

执行完成后,项目根目录中会生成 compile_commands.json 文件。

打开源文件,头文件下方出现一条下划线,说明 clangd 已经成功解析头文件;按住 Ctrl + 左键,即可精确跳转到函数或变量的声明位置,提高源码阅读效率。

2.4 VSCode 调试环境配置

在这里插入图片描述

1. 配置 tasks.json(编译任务,确保调试前自动编译)

tasks.json 的作用是:每次启动调试前,自动执行 bear make 重新编译,保证代码是最新的。替换 tasks.json 的内容为以下代码:

{"version": "2.0.0","tasks": [{"type": "cppbuild","label": "build-redis",  // 任务名称,后续 launch.json 要用到,不能改"command": "bear",        // 执行的命令:bear"args": ["make"],         // 命令参数:make(即执行 bear make)"options": {"cwd": "${workspaceFolder}"  // 编译目录:当前打开的源码根目录(无需改)},"problemMatcher": ["$gcc"],    // 识别 gcc 编译错误"group": {"kind": "build","isDefault": true       // 设为默认编译任务},"detail": "调试前自动编译 Redis 源码"}]
}

2. 配置 launch.json(调试参数,指定调试哪个程序)

launch.json 的作用是:告诉 VSCode 用哪个程序(redis-server)、哪个调试器(GDB)、带什么参数(redis.conf)启动调试。替换 launch.json 的内容为以下代码:

{"version": "0.2.0","configurations": [{"name": "启动 redis","type": "cppdbg","request": "launch","program": "${workspaceFolder}/src/redis-server","args": ["redis.conf"],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "将反汇编风格设置为 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}],"preLaunchTask": "build-redis","miDebuggerPath": "/usr/bin/gdb"}]
}

三、启动调试

完成上述配置后,在 VSCode 中按 F5 或点击“运行 -> 启动调试”,即可开始调试 Redis 服务器。当服务器启动后,可以在 VSCode 的调试侧边栏或底部终端中观察到 Redis 创建的多线程环境。

在这里插入图片描述

  • redis-server:这是 Redis 的主线程,负责处理命令请求、执行事务、运行 Lua 脚本等核心逻辑。
  • bio_close_file:阻塞 IO 线程,负责关闭文件(避免主线程卡壳)。
  • bio_aof_fsync:阻塞 IO 线程,负责在 AOF 持久化模式下,异步将 AOF 文件缓冲区数据刷到磁盘,确保数据持久化。
  • bio_lazy_free:阻塞 IO 线程,负责异步释放大内存块(比如删除很大的键)。
  • io_thd_* :这是 Redis 6.0 引入的 I/O 多线程。主要负责处理网络 I/O,即读取请求数据和写回响应数据,以此减轻主线程的网络负载。
  • jemalloc_bg_thd:这是 Redis 所使用的 jemalloc 内存池内部开启的后台线程,用于执行内存碎片整理等维护任务。

补充:

Redis 6.0+ 引入了 IO 多线程(用于加速网络 IO 读写),但该功能默认是关闭的,需要手动在配置文件中开启,否则不会创建 io_thd_* 相关线程。

需编辑 Redis 的配置文件 redis.conf(即调试时指定的 redis.conf),开启 IO 多线程相关配置:

  1. 找到并修改 io-threads-do-reads:在 redis.conf 中搜索(Ctrl + F) io-threads-do-reads,默认值是 no,将其改为 yes,表示 “启用 IO 多线程处理读操作”。

  2. 配置 IO 线程数量 io-threads:继续在 redis.conf 中搜索 io-threads,默认值是 1(即仅主线程处理 IO)。可根据 CPU 核心数调整,例如设置为 4(建议值 ≤ CPU 核心数,比如 4 核 CPU 设为 4)。

示例配置:

io-threads-do-reads yes 
io-threads 4

保存 redis.conf 后,重新启动调试

http://www.dtcms.com/a/487293.html

相关文章:

  • 备案主体负责人 网站负责人哪个网站做ppt好
  • C文件中在编译时候怎么把几个同名函数链接进来
  • 影视 IP 全链开发:App 如何成为核心
  • 机房网络组建方案搜索引擎优化的核心是
  • CentOS7虚拟机扩容操作指南(CentOS7虚拟机磁盘大小不够)
  • Replication(下):事务,一致性与共识
  • PIL与OpenCV图像读取的颜色格式陷阱:RGB vs BGR
  • 佳能LBP6018L黑白激光打印机打印浅淡的一点尝试性解决方法
  • 网站主页面设计哪个好jizhicms
  • x86虚拟化漏洞与硬件辅助虚拟化演进要点
  • 做奥网站营销网站建设设计
  • Cocos Creator学习之性能优化
  • 分类信息多城市网站优秀网站设计要素
  • 从 “越充越坏” 到 “精准修复”:DCA-8000 动态诊断充电系统实操案例与问题解决
  • 做oa系统的网站网站开发方向的工作
  • 服务请求出现偶发超时问题,经查服务本身没问题,问题出现在nginx转发。
  • 前端 20 个零依赖浏览器原生 API 实战清单
  • 网站管理包括广州新闻发布会
  • 网站开发外包哪家好wordpress好还是
  • SGD、Adam 和 AdamW
  • 导出pdf记录-暂记
  • HarmonyOS屏幕方向适配指南
  • 浏览器书签脚本(书签小程序)学习
  • 网站营销单页怎么设计方案怎样做视频网站
  • ComfyUI部署以及节点扩展
  • CentOS部署Docker容器
  • centOS防火墙操作
  • 个人网站建设规划app展示网站模板
  • 做网站意义和目的阿里云服务器做电影网站
  • 建设网站公司有哪些小程序推广联盟