当阅读redis源码的时候,如果能够实现redis server的单步跟踪调试会方便很多。
选择使用vscode,通过配置cmake的方式实现redis的单步调试。
redis或者keydb并没有提供cmake文件,但是通过对makefile进行分析,可以写出redis server的CMakeLists.txt文件,这是很关键的一步。直接上文件内容:
cmake_minimum_required(VERSION 3.10)
project(keydb)
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 17)
link_libraries(pthread dl ssl crypto uuid)
set(KEYDB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(
deps
deps/concurrentqueue
deps/lua/src
deps/hiredis
deps/hdr_histogram
deps/linenoise
src
)
set(KEYDB_SRCS
src/storage/teststorageprovider.cpp
src/memtest.c
src/acl.cpp
src/adlist.c
src/ae.cpp
src/anet.c
src/aof.cpp
src/bio.cpp
src/bitops.cpp
src/blocked.cpp
src/childinfo.cpp
src/crc16.c
src/crc64.c
src/crcspeed.c
src/cron.cpp
src/db.cpp
src/debug.cpp
src/defrag.cpp
src/dict.cpp
src/endianconv.c
src/evict.cpp
src/expire.cpp
src/fastlock.cpp
src/geo.cpp
src/geohash_helper.cpp
src/geohash.c
src/hyperloglog.cpp
src/intset.c
src/latency.cpp
src/lazyfree.cpp
src/listpack.c
src/localtime.c
src/lzf_c.c
src/lzf_d.c
src/module.cpp
src/monotonic.c
src/motd.cpp
src/mt19937-64.c
src/multi.cpp
src/networking.cpp
src/new.cpp
src/notify.cpp
src/object.cpp
src/pqsort.c
src/pubsub.cpp
src/quicklist.c
src/rand.c
src/rax.c
src/rdb-s3.cpp
src/rdb.cpp
src/redis-check-aof.cpp
src/redis-check-rdb.cpp
src/release.c
src/replication.cpp
src/rio.cpp
src/scripting.cpp
src/sds.c
src/sentinel.cpp
src/server.cpp
src/setcpuaffinity.c
src/setproctitle.c
src/sha1.c
src/sha256.c
src/siphash.c
src/slowlog.cpp
src/snapshot.cpp
src/SnapshotPayloadParseState.cpp
src/sort.cpp
src/sparkline.cpp
src/storage-lite.c
src/storage.cpp
src/StorageCache.cpp
src/syncio.cpp
src/t_hash.cpp
src/t_list.cpp
src/t_nhash.cpp
src/t_set.cpp
src/t_stream.cpp
src/t_string.cpp
src/t_zset.cpp
src/timeout.cpp
src/tls.cpp
src/tracking.cpp
src/util.c
src/ziplist.c
src/zipmap.c
src/zmalloc.cpp
src/config.cpp
src/cluster.cpp
src/connection.cpp
src/AsyncWorkQueue.cpp
src/keydbutils.cpp
)
set(KEYDB_DEPS
deps/hiredis/alloc.c
deps/hiredis/async.c
deps/hiredis/dict.c
deps/hiredis/hiredis.c
deps/hiredis/net.c
deps/hiredis/read.c
deps/hiredis/sds.c
deps/hiredis/sockcompat.c
deps/hiredis/ssl.c
deps/lua/src/fpconv.c
deps/lua/src/lapi.c
deps/lua/src/lauxlib.c
deps/lua/src/lbaselib.c
deps/lua/src/lcode.c
deps/lua/src/ldblib.c
deps/lua/src/ldebug.c
deps/lua/src/ldo.c
deps/lua/src/ldump.c
deps/lua/src/lfunc.c
deps/lua/src/lgc.c
deps/lua/src/linit.c
deps/lua/src/liolib.c
deps/lua/src/llex.c
deps/lua/src/lmathlib.c
deps/lua/src/lmem.c
deps/lua/src/loadlib.c
deps/lua/src/lobject.c
deps/lua/src/lopcodes.c
deps/lua/src/loslib.c
deps/lua/src/lparser.c
deps/lua/src/lstate.c
deps/lua/src/lstring.c
deps/lua/src/lstrlib.c
deps/lua/src/ltable.c
deps/lua/src/ltablib.c
deps/lua/src/ltm.c
deps/lua/src/lua_bit.c
deps/lua/src/lua_cjson.c
deps/lua/src/lua_cmsgpack.c
deps/lua/src/lua_struct.c
deps/lua/src/lundump.c
deps/lua/src/lvm.c
deps/lua/src/lzio.c
deps/lua/src/print.c
deps/lua/src/strbuf.c
)
set(KEYDB_SERVER_SRCS
${KEYDB_SRCS}
${KEYDB_DEPS}
${ML_BOM_APPLICATION}
)
add_executable(keydb-server ${KEYDB_SERVER_SRCS})
target_include_directories(keydb-server PRIVATE
${KEYDB_SOURCE_DIR}
)
target_link_directories(keydb-server PRIVATE
${CMAKE_CURRENT_BINARY_DIR}/ml_deps/kafka/lib
)
target_compile_definitions(keydb-server PRIVATE
-D__USE_POSIX
-D_REENTRANT
-D_GNU_SOURCE
-D__STDC_FORMAT_MACROS
)
target_link_libraries(keydb-server PRIVATE
m
pthread
)
将这个文件放到CMakeLists.txt文件中,将该文件放到代码根目录下,也就是makefile所在的目录下就可以了。
由于采用的redis版本不同,里面的文件也有一些变化,所以需要大致了解cmake的基本语法,通过对工程的调试,找出相对于你的redis源码,多余的文件和缺失的文件,该删除的删除,该补充的补充进去就行了。我采用的是redis的keydb分支。
通过这个cmake文件,也可以得到一些redis相关的代码知识。比如,通过观察这个cmake文件,就能看出来,redis将所有的业务相关的文件都放到了src下面,并且没有将头文件和实现文件分开放。其他一些依赖的文件在deps中。
然后通过配置vscode的c/c++代码调试工程就可以实现代码的单步调试了。当然,有了CMakeLists.txt,你也可以选择clion等其他的工具。但是应该注意的是,redis只能在linux环境下运行,你的工具也应该支持linux,或者可以通过远程调试,vscode就支持远程连接服务器进行调试。
它得到的目标文件keydb-server.exe,也可以单独运行。
当调试的时候,找到main函数,它在server.cpp(keydb里面有一部分是C++代码,所以这里是CPP文件,在纯的redis中,应该是server.c)的最下面。
在里面加个断点,进行调试就可以断到断点位置,当然,也可以通过客户端连接,然后通过cli命令进行调试。