原创不易,转载请注明出处
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本文就是记录一下redis源码调试环境的搭建过程,防止以后用到再搭建还得现找资料,最开始看redis源码的时候直接看的静态代码,但是随着深入有些就需要debug验证的地方,这个时候就需要搭建一套可debug的源码阅读环境
1.环境准备
操作系统我这边用的是Ubuntu 18桌面版,ide是用的clion,redis版本是5.0.5
这里为啥要用ubuntu,我们redis生产都是跑在linux系统上的,使用linux系的操作系统能够贴近生产,还有一个就是出现问题的概率小。
ide 为啥用clion ,搞Java出身的,idea用的还算是熟练,clion跟idea差不多,上手速度快。
redis 5.0.5 网上的资料多点。
ubuntu 操作系统安装这里不介绍了,如果是使用window操作系统,可以使用wmware 整个ubuntu虚拟机,我这边是使用的服务器。
1.1 ubuntu安装软件
1、安装gcc
$ sudo apt install gcc
2、安装g++
$ sudo apt install g++
3、安装cmake
$ sudo apt install cmake
参考文档:https://vegetable-chicken.blog.csdn.net/article/details/103056279
1.2 clion安装
这个直接进ubuntu的应用商店下载搜索下载即可
1.3 redis源码下载
git客户端安装,官方地址: https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git
ubuntu 安装git命令:
$ sudo apt install git-all
直接github 搜 redis,然后fork到自己的仓库中,最后clion下来即可
从5.0.5 tag 创建一个新的分支
git checkout -b 5.0.5 5.0.5
redis 项目目录
2.项目中添加CMakeLists
- deps 目录下创建 CMakeLists.txt文件
文件内容:
add_subdirectory(hiredis)
add_subdirectory(linenoise)
add_subdirectory(lua)
- deps/hiredis目录下创建CMakeLists.txt文件
文件内容:
add_library(hiredis STATIC
hiredis.c
net.c
dict.c
net.c
sds.c
async.c
read.c)
- deps/linenoise目录下创建CMakeLists.txt文件
文件内容:
add_library(linenoise
linenoise.c)
- deps/lua目录下创建CMakeLists.txt文件
文件内容:
set(LUA_SRC
src/fpconv.c
src/lapi.c
src/lauxlib.c
src/lbaselib.c
src/lcode.c
src/ldblib.c
src/ldebug.c
src/ldo.c
src/ldump.c
src/lfunc.c
src/lgc.c
src/linit.c
src/liolib.c
src/llex.c
src/lmathlib.c
src/lmem.c
src/loadlib.c
src/lobject.c
src/lopcodes.c
src/loslib.c
src/lparser.c
src/lstate.c
src/lstring.c
src/lstrlib.c
src/ltable.c
src/ltablib.c
src/ltm.c
src/lua.c
src/lua_bit.c
src/lua_cjson.c
src/lua_cmsgpack.c
src/lua_struct.c
src/luac.c
src/lundump.c
src/lvm.c
src/lzio.c
src/print.c
src/strbuf.c)
add_library(lua STATIC ${LUA_SRC})
- /src/modules目录下创建CMakeLists.txt文件
文件内容:
cmake_minimum_required(VERSION 3.9)
set(CMAKE_BUILD_TYPE "Debug")
add_library(helloworld SHARED helloworld.c)
set_target_properties(helloworld PROPERTIES PREFIX "" SUFFIX ".so")
add_library(hellotype SHARED hellotype.c)
set_target_properties(hellotype PROPERTIES PREFIX "" SUFFIX ".so")
add_library(helloblock SHARED helloblock.c)
set_target_properties(helloblock PROPERTIES PREFIX "" SUFFIX ".so")
add_library(testmodule SHARED testmodule.c)
set_target_properties(testmodule PROPERTIES PREFIX "" SUFFIX ".so")
- 项目目录下创建CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.6) #cmake版本需求
project(redis_5_0_5) #工程
set(CMAKE_BUILD_TYPE "Debug")
get_filename_component(REDIS_ROOT "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
add_subdirectory(deps)
add_subdirectory(src/modules)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -pedantic -DREDIS_STATIC=''")
set(SRC_SERVER
src/t_stream.c
src/lolwut.c
src/localtime.c
src/listpack.c
src/lolwut5.c
src/adlist.c
src/quicklist.c
src/ae.c
src/anet.c
src/dict.c
src/server.c
src/sds.c
src/zmalloc.c
src/lzf_c.c
src/lzf_d.c
src/pqsort.c
src/zipmap.c
src/sha1.c
src/ziplist.c
src/release.c
src/networking.c
src/util.c
src/object.c
src/db.c
src/replication.c
src/rdb.c
src/t_string.c
src/t_list.c
src/t_set.c
src/t_zset.c
src/t_hash.c
src/config.c
src/aof.c
src/pubsub.c
src/multi.c
src/debug.c
src/sort.c
src/intset.c
src/syncio.c
src/cluster.c
src/crc16.c
src/endianconv.c
src/slowlog.c
src/scripting.c
src/bio.c
src/rio.c
src/rand.c
src/memtest.c
src/crc64.c
src/bitops.c
src/sentinel.c
src/notify.c
src/setproctitle.c
src/blocked.c
src/hyperloglog.c
src/latency.c
src/sparkline.c
src/redis-check-rdb.c
src/redis-check-aof.c
src/geo.c
src/lazyfree.c
src/module.c
src/evict.c
src/expire.c
src/geohash.c
src/geohash_helper.c
src/childinfo.c
src/defrag.c
src/siphash.c
src/rax.c)
set(SRC_CLIENT src/siphash.c
src/dict.c
src/crc16.c
src/anet.c
src/adlist.c
src/redis-cli.c
src/zmalloc.c
src/release.c
src/ae.c
src/crc64.c)
set(EXECUTABLE_OUTPUT_PATH src)
link_directories(deps/linenoise deps/lua/src deps/hiredis)
add_executable(redis-server ${SRC_SERVER})
add_executable(redis-cli ${SRC_CLIENT})
target_include_directories(redis-server
PRIVATE ${REDIS_ROOT}/deps/linenoise
PRIVATE ${REDIS_ROOT}/deps/hiredis
PRIVATE ${REDIS_ROOT}/deps/lua/src
#PRIVATE ${REDIS_ROOT}/deps/jemalloc
)
target_include_directories(redis-cli
PRIVATE ${REDIS_ROOT}/deps/linenoise
PRIVATE ${REDIS_ROOT}/deps/hiredis
PRIVATE ${REDIS_ROOT}/deps/lua/src
#PRIVATE ${REDIS_ROOT}/deps/jemalloc
)
target_link_libraries(redis-server
PRIVATE pthread
PRIVATE m
PRIVATE dl
PRIVATE lua
PRIVATE linenoise
PRIVATE hiredis)
target_link_libraries(redis-cli
PRIVATE pthread
PRIVATE m
PRIVATE dl
PRIVATE linenoise
PRIVATE hiredis)
参考文档1:https://blog.csdn.net/tpc4289/article/details/113589069 本文主要是按照这个文档配置
参考文档2:http://www.zyiz.net/tech/detail-141342.html 按照这个文档也能搞起来
3.启动测试
整完 CMakeLIsts.txt之后
就可以启动redis-server 与redis-cli了
启动redis-server:
启动redis-cli:
这里你是没法输入命令的,可以到编译目录 cmake-build-debug 目录下面 src 下面找到redis-cli可执行文件
执行: ./redis-cli
就进入命令行交互:
到这我们这redis源码调试环境就搭建好了。
参考文档1:https://blog.csdn.net/tpc4289/article/details/113589069 本文主要是按照这个文档配置
参考文档2:http://www.zyiz.net/tech/detail-141342.html 按照这个文档也能搞起来
参考文档3:https://vegetable-chicken.blog.csdn.net/article/details/103056279