本文主要介绍如何编译Redis
项目并在JetBrains CLion
(以下简称CLion
)中运行/调试。
0. 开始之前
JSON Compilation Database
CLion
默认支持CMake
构建的项目,但Redis
项目是基于Make
构建的。对于使用Make
构建的项目,CLion
仍然可以通过Compilation Database
来导入项目,而不用将其修改为CMake
项目。同时也能通过Compilation Database
实现代码的分析、跳转等功能,这对于我们进行代码调试很有帮助。
有关于Compilation Database
的介绍可以参考这几篇文章:
Clang
官方的Compilation Database
介绍页面:JSON Compilation Database Format Specification — Clang 11 documentation- 这篇文章介绍了在不同场景下生成
Compilation database
的各种工具:Compilation database — Sarcasm notebook CLion
的帮助页面简要介绍了Compilation Database
,以及在CLion
的使用:Compilation Database - Help | CLion
对于基于Make
构建的Redis
项目来说,有一些工具可以生成Compilation Database
,比如下面几个:
- https://github.com/rizsotto/Bear
- https://github.com/rizsotto/scan-build
- https://github.com/nickdiego/compiledb
通常默认生成的Compilation Database
是一个compile_commands.json
文件。
1. 下载Redis源码
1 | git clone git@github.com:redis-io/redis.git |
2. 编译构建Redis
Redis
基于Make
构建,执行make
命令即可完成构建。Redis
默认使用-O2
级别优化,可以使用make noopt
来编译以关闭优化,获得更多的调试信息。
我们需要使用工具来生成Compilation Database
,以便于导入CLion
。在不同系统上各个工具安装情况可能略有不同,下面分别介绍Ubuntu 16.04
和MacOS 10.15
上编译Redis
并生成Compilation Database
的方法。
Ubuntu 16.04
使用Bear工具
1 | # 下载Bear工具 |
使用compiledb工具
1 | # 安装pip |
MacOS 10.15
使用Bear工具
在MacOS
上使用Bear工具需要关闭SIP,关闭方法是进入恢复模式执行csrutil disable
命令,然后重启,详细操作方法请自行搜索。
我们需要用到Homebrew
来安装Bear
,如果没有安装Homebrew
需要先安装Homebrew
,安装方法:
1 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" |
开始编译Redis
:
1 | # 下载Bear工具 |
如果遇到adlist.c:32:10: fatal error: 'stdlib.h' file not found
报错,可以先执行以下命令后重试:
1 | sudo mount -uw / |
使用compiledb工具
我们需要使用pip
来安装compiledb
,如果没有安装pip
需要先安装pip
,安装方法:
1 | curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py |
开始编译Redis
:
1 | # pip安装 compiledb |
编译完成之后可以检验以下是否成功:
1 | $ ./src/redis-server --version |
同时根目录下应该会有一个不为空的compile_commands.json
文件。
导入CLion并调试
对于如何在CLion
中管理基于Make
构建的项目,CLion
的官方帮助文档中有详细的介绍:
Managing Makefile Projects。参考上述文档,本小节简要介绍了如何在CLion
中导入Redis
项目并运行/调试的方法。
下载安装
CLion
,并安装Makefile Support
插件。建议使用最新版本,较老的版本是不支持Make
构建的项目的。导入项目。打开
CLion
,选择Open Or Import
,选择项目目录中的compile_commands.json
文件,弹出框选择Open as Project
,等待文件索引完成。
创建自定义
Build Target
。点击File
菜单栏,Settings | Build, Execution, Deployment | Custom Build Targets
,点击+
新建一个Target
。Name
:Target
的名字,之后在创建Run/Debug
配置的时候会看到这个名字- 点击
Build
或者Clean
右边的三点,弹出框中点击+
新建两个External Tool
配置如下:
第一个配置如下,用来指定构建指令,Program 和 Arguments 共同构成了所要执行的命令 “make noopt”第二个配置如下,用来清理构建输出,Program 和 Arguments 共同构成了所要执行的命令 “make clean”1
2
3
4Name: make
Program: make
Arguments: noopt
Working directory: $ProjectFileDir$1
2
3
4Name: make clean
Program: make
Arguments: clean
Working directory: $ProjectFileDir$ ToolChain
选择Default
;Build
选择make
(上面创建的第一个External Tool
);Clean
选择make clean
(上面创建的第二个External Tool
)
创建自定义的
Run/Debug configuration
。点击Run
菜单栏,Edit Configurations
, 点击+
,选择Custom Build Application
,配置如下:1
2
3
4
5
6
7
8# Name:Configure 的名称
Name: redis
# Target:选择上一步创建的 “Custom Build Target”
Target: redis
# Executable:程序执行入口,也就是需要调试的程序
Executable: 这里我们调试Redis Server,选择`{source_root}/src/redis-server`。
# Program arguments: 与 “Executable” 配合使用,指定其参数
Program arguments: 这里我们选择"$ProjectFileDir$/redis.conf"作为配置文件启动Redis服务器Executable
和Program arguments
可以根据需要调试的信息自行设置。如果不想每次运行/调试前都执行
Build
操作(在这里就是Make
构建过程),可以在编辑页下方Before launch
框中删除Build
条目。
点击
Run
/Debug
开始运行/调试。