实现redis服务端的单步调试

当阅读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命令进行调试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值