使用CLion在Windows下调试Redis代码
调试方式
这个教程使用的是远程调试(不是远程桌面),代码在Linux下编译和运行,调试客户端在Windows(或者Mac,以下简称Windows)。这样调试的好处是调试环境与真实环境一致,都在Linux运行。
需求
- 一台Linux主机
云服务器、虚拟机、WSL、Docker都可以,只要你电脑可以通过ssh连接上它。
- Windows 下安装 CLion
- 在Windows下安装CLion。
- 登录到Linux,先安装依赖:
Centos:
yum install gitcmake make gcc gcc-c++ gdb libarchive telnet
Ubuntu:
sudo apt update sudo apt install gitcmake make gcc g++ gdb
- 下载Redis源代码到Linux:
git clone https://github.com/redis/redis.git
- 切换Redis代码到你想要调试的版本:
cd redis git checkout 5.0.8
- 在Windows下创建一个空文件夹
debug-redis
。
不需要把代码clone进来,稍后会从Linux主机上同步过来。如果clone到Windows,再把代码传到Linux,会出现文件权限不对、换行符不对等问题导致编译出现奇奇怪怪的错误。
- 启动Clion,点击Open打开刚刚创建的空文件夹
debug-redis
:
文章图片
- 点击菜单栏
File
>Settings
打开设置面板。继续找到Editor
>Code Style
,把换行符改为\n
:
文章图片
- 继续在设置面板找到
Build, Execution, Deployment
>Toolchians
,点击+
号新增一个Remote Host
:
文章图片
- 点击
Credentials
输入框右边的齿轮图标:
文章图片
- 然后在弹框中点击
+
号新增一个服务器,填写服务器IP地址、ssh的用户名和密码,然后点击Test Connection
,测试可以连接后保存。
文章图片
- 保存服务器信息后继续配置
ToolChains
。这时会自动识别服务器上的编译工具的路径,如果不能自动识别,可以手动填进去,然后点击Apply
保存。
文章图片
- 切换到
Build, Execution, Deployment
>CMake
,在ToolChains
输入框选择Remote Host
:
文章图片
- 切换到
Build, Execution, Deployment
>Deployment
,再依次点击Remote Host
、Mappings
,然后输入Linux主机上redis代码的目录,然后点击OK
保存并关闭配置窗口。
文章图片
- 依次点击菜单栏
Tools
>Deployment
>Download From ...
>Remote Host
,然后等待代码从服务器上同步下来(右下角有进度条)。
文章图片
- 代码同步成功后,CLion还没有识别
Makefile
文件。在左侧文件目录双击打开Makefile
文件,然后点击load Makefile Project
:
文章图片
- 再打开设置面板,找到
Build, Execution, Deployment
>MakeFile
,在ToolChains
下拉框中选择"Remote Host",然后保存。
文章图片
- 保存后CLion会自动上传代码到服务器、开始编译。等待一会,可能会提示编译失败:
文章图片
- 在“编译”图标旁边的下拉框选择
Edit Configurations
文章图片
- 在弹窗左侧选择
redis-server
,并在Executable
中输入src/redis-server
。这是redis编译后的二进制脚本。
文章图片
- 点击锤子图标,开始编译:
文章图片
- 大概一两分钟后,编译完成。
文章图片
- 搜索代码
void getCommand()
,找到t_string.c/getCommand()
,打上断点:
文章图片
- 点击蜘蛛图标,开始调试!
文章图片
> 这时候服务器上会运行redis-server,并监听6379端口,你可以通过`netstat -an`命令查看
- 【使用CLion在Windows下调试Redis代码】在服务器上使用
telnet 127.0.0.1 6379
连接到redis(或者redis-cli),然后使用get
命令获取一个key:
[root@VM-8-5-centos ~]# telnet 127.0.0.1 6379 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. get hello
- 这时候程序就会停在刚刚的断点位置。你可以使用F7( step in)、F8( step out)来调试代码了。
文章图片