暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

简单几步!搭建Redis源码调试环境!

DBA成长之道 2021-03-10
3788

本文演示的是Mac使用CLion搭建Redis5.0源码的调试环境过程。Redis对各操作系统的底层接口实现了封装。所以在各操作系统上的调试搭建环境过程基本上是大同小异。


过程

下载Redis5.0源代码

    git clone https://github.com/antirez/redis


    使用CLion打开Redis项目

    CLion使用CMake作为其编译系统,利用CMake的配置文件CMakeLists.txt可以很方便的创建编译器本身的代码环境。所以,用CLion打开下载的Redis源码目录后,需要添加相应的CMakeLists.txt文件。


    添加CMakeLists.txt


    在deps/hiredis根目录下面添加CMakeLists.txt文件

      add_library(hiredis STATIC
      hiredis.c
      net.c
      dict.c
      sds.c
      async.c
      read.c
      )


      在deps/linenoise根目录下面添加CMakeLists.txt文件

        add_library(linenoise linenoise.c)


        在deps/lua根目录下面添加CMakeLists.txt文件

          set(LUA_SRC
          src/lapi.c src/lcode.c src/ldebug.c src/ldo.c src/ldump.c src/lfunc.c
          src/lgc.c src/llex.c src/lmem.c
          src/lobject.c src/lopcodes.c src/lparser.c src/lstate.c src/lstring.c
          src/ltable.c src/ltm.c
          src/lundump.c src/lvm.c src/lzio.c src/strbuf.c src/fpconv.c
          src/lauxlib.c src/lbaselib.c src/ldblib.c src/liolib.c src/lmathlib.c
          src/loslib.c src/ltablib.c
          src/lstrlib.c src/loadlib.c src/linit.c src/lua_cjson.c
          src/lua_struct.c
          src/lua_cmsgpack.c
          src/lua_bit.c
          )


          add_library(lua STATIC ${LUA_SRC})


          在deps根目录下面添加CMakeLists.txt文件

            add_subdirectory(hiredis)
            add_subdirectory(linenoise)
            add_subdirectory(lua)


            在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")


              在Redis根目录下添加CMakeLists.txt文件

                cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
                project(redis VERSION 4.0)


                set(CMAKE_BUILD_TYPE "Debug")
                get_filename_component(REDIS_ROOT "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)


                add_subdirectory(deps)
                add_subdirectory(src/modules)


                set(SRC_SERVER_TMP
                src/adlist.c
                src/ae.c
                src/anet.c
                src/dict.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/evict.c
                src/defrag.c
                src/module.c
                src/quicklist.c
                src/expire.c
                src/childinfo.c
                src/redis-check-aof.c
                src/redis-check-rdb.c
                src/lazyfree.c
                src/geohash.c
                src/rax.c
                src/geohash_helper.c
                src/siphash.c
                src/geo.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/t_stream.c
                src/lolwut.c
                src/lolwut5.c
                src/listpack.c
                src/localtime.c
                )


                set(SRC_SERVER src/server.c ${SRC_SERVER_TMP})
                set(SRC_CLI
                src/anet.c
                src/sds.c
                src/adlist.c
                src/redis-cli.c
                src/zmalloc.c
                src/release.c
                src/anet.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})
                target_include_directories(redis-server
                PRIVATE ${REDIS_ROOT}/deps/linenoise
                PRIVATE ${REDIS_ROOT}/deps/hiredis
                PRIVATE ${REDIS_ROOT}/deps/lua/src
                )
                target_link_libraries(redis-server
                PRIVATE pthread
                    PRIVATE dl
                PRIVATE m
                PRIVATE lua
                PRIVATE linenoise
                PRIVATE hiredis
                )


                add_executable(redis-cli ${SRC_CLI})
                target_include_directories(redis-cli
                PRIVATE ${REDIS_ROOT}/deps/linenoise
                PRIVATE ${REDIS_ROOT}/deps/hiredis
                PRIVATE ${REDIS_ROOT}/deps/lua/src
                )
                target_link_libraries(redis-cli
                PRIVATE pthread
                PRIVATE m
                PRIVATE linenoise
                PRIVATE hiredis
                )


                解决报错问题

                在添加完CMakeLists.txt文件之后,CLion会自动进行编译源码,编译完成之后,代码就可以debug了。有的时候CLion不会进行编译,可以手动的进行编译操作。选中redis根目录下的CMakeLists.txt文件进行手动编译。或者让编译器自己导入进行编译。


                在编译完成后会出现这样的一个目录



                我们选择redis-server后,点击调试按钮开始进行调试操作。




                此时会遇到以下几种错误,我们来逐一解决:

                一、部分C文件找不到函数


                这个时候只需要点击进入ae_kqueue.c文件中,添加下面两个头文件:

                  #include "ae.h"
                  #include "zmalloc.h"


                  二、缺少依赖的.h文件

                  我们只需要进入src目录下,执行mkreleasehdr.sh脚本即可:

                    [@huzhibindeMacBook-Pro:src (redis-omg)]$ pwd
                    /Users/hzb/redis_github/redis_tmp/src
                    [@huzhibindeMacBook-Pro:src (redis-omg)]$ sh mkreleasehdr.sh
                    [@huzhibindeMacBook-Pro:src (redis-omg)]$


                    三、CMakeList.txt导入c函数不完全




                    只需要找到红圈中方法对应函数所在的C文件,再添加到redis根目录下的CMakeList.txt的SRC_SERVER_TMP下后重新编译就行了。


                    在解决上面这些问题后,就可以看到熟悉的运行成功界面了。然后就开始愉快(kubi)的调试过程吧~



                    你的关注就是对我们最大的支持

                    长按屏幕识别图中二维码关注我们


                    文章实用,别忘了给我们点赞  


                    文章转载自DBA成长之道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论