美文网首页
Redis6.0源码分析(一)调试环境搭建

Redis6.0源码分析(一)调试环境搭建

作者: 布朗XD | 来源:发表于2020-11-19 19:47 被阅读0次

    本系列课程讲解Redis6.0的源码,为了让大家能更好的对c语言的Redis源码上手,我们选择在Windows下使用debug环境阅读源码(感谢Smart哥的友情分享),下面我们就开始搭建环境。

    安装配置cygwin

    Cygwin是一个在windows平台上运行的类UNIX模拟环境,可以让我们在windows下模拟Linux下的命令
    1.下载https://cygwin.com/setup-x86_64.exe (64位)版本或者https://cygwin.com/setup-x86.exe (32位版本)
    2.点击下一步,这一步一定要选择Direct Connection

    image.png
    接下来,添加网易的镜像站
    image.png
    我们需要安装wget、 gcc-core、gcc-g++、make、gdb、binutils。以下是我测试通过的版本号:
    • wget 1.20.3-1
    • gcc-core 10.2.0.1
    • make 4.3-1
    • gdb 7.9.1-1 (8.3版本无法启动)
    • binutils 2.34

    安装apt-cyg

    GitHub下载脚本:https://github.com/transcode-open/apt-cyg
    复制apt-cyg,粘贴到cygwin的安装目录的bin目录下。

    image.png

    打开Cygwin,输入命令:

    ##该命令后面会用到 
    apt-cyg install dos2unix
    

    CLion导入项目

    CLion 是 JetBrains 推出的全新的 C/C++ 跨平台集成开发环境,对于习惯使用IDEA开发Java项目的程序员们来说是一个福音,安装方式略(与IDEA相同)。


    image.png

    选择此选项,导入redis 6.0项目,导入之后会自动生成CMakeLists.txt。


    image.png
    修改如下四个文件:

    ./CMakeLists.txt

    cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
    project(redis VERSION 6.0)
    if (NOT CMAKE_BUILD_TYPE)
        message(STATUS "No build type defined; defaulting to 'Debug'")
        set(CMAKE_BUILD_TYPE "Debug" CACHE STRING
                "The type of build. Possible values are: Debug, Release,
    RelWithDebInfo and MinSizeRel.")
    endif()
    message(STATUS "Host is: ${CMAKE_HOST_SYSTEM}. Build target is:
    ${CMAKE_SYSTEM}")
    get_filename_component(REDIS_ROOT "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
    message(STATUS "Project root directory is: ${REDIS_ROOT}")
    # Just for debugging when handling a new platform.
    if (false)
        message("C++ compiler supports these language features:")
        foreach(i ${CMAKE_CXX_COMPILE_FEATURES})
            message(" ${i}")
        endforeach()
    endif()
    message(STATUS "Generating release.h...")
    execute_process(
            COMMAND sh -c ./mkreleasehdr.sh
            WORKING_DIRECTORY ${REDIS_ROOT}/src/
    )
    add_subdirectory(deps)
    add_subdirectory(src/modules)
    set(SRC_SERVER_TMP
            src/crcspeed.c
            src/crcspeed.h
            src/sha256.c
            src/sha256.h
            src/connection.c
            src/connection.h
            src/acl.c
            src/timeout.c
            src/tracking.c
            src/tls.c
            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/lolwut.h
            src/lolwut5.c
            src/lolwut6.c
            src/listpack.c
            src/localtime.c
            src/gopher.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
            )
    if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
        # better not to work with jemalloc
    endif()
    add_executable(redis-server ${SRC_SERVER})
    add_executable(redis-cli ${SRC_CLI})
    set_property(TARGET redis-server PROPERTY C_STANDARD 99)
    set_property(TARGET redis-server PROPERTY CXX_STANDARD 11)
    set_property(TARGET redis-server PROPERTY CXX_STANDARD_REQUIRED ON)
    set_property(TARGET redis-cli PROPERTY C_STANDARD 99)
    set_property(TARGET redis-cli PROPERTY CXX_STANDARD 11)
    set_property(TARGET redis-cli PROPERTY CXX_STANDARD_REQUIRED ON)
    target_include_directories(redis-server
            PRIVATE ${REDIS_ROOT}/deps/hiredis
            PRIVATE ${REDIS_ROOT}/deps/linenoise
            PRIVATE ${REDIS_ROOT}/deps/lua/src
            )
    target_include_directories(redis-cli
            PRIVATE ${REDIS_ROOT}/deps/hiredis
            PRIVATE ${REDIS_ROOT}/deps/linenoise
            PRIVATE ${REDIS_ROOT}/deps/lua/src
            )
    target_link_libraries(redis-server
            PRIVATE pthread
            PRIVATE m
            PRIVATE lua
            PRIVATE linenoise
            PRIVATE hiredis
            )
    target_link_libraries(redis-cli
            PRIVATE pthread
            PRIVATE m
            PRIVATE linenoise
            PRIVATE hiredis
            )
    link_directories(deps/hiredis/ deps/linenoise/ diredeps/lua/src)
    

    .deps/CMakeLists.txt

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

    deps/lua/CMakeLists.txt

    set(LUA_SRC
            src/lauxlib.c
            src/liolib.c
            src/lopcodes.c
            src/lstate.c
            src/lobject.c
            src/print.c
            src/lmathlib.c
            src/loadlib.c
            src/lvm.c
            src/lfunc.c
            src/lstrlib.c
            src/lua.c
            src/linit.c
            src/lstring.c
            src/lundump.c
            src/luac.c
            src/ltable.c
            src/ldump.c
            src/loslib.c
            src/lgc.c
            src/lzio.c
            src/ldblib.c
            src/strbuf.c
            src/lmem.c
            src/lcode.c
            src/ltablib.c
            src/lua_struct.c
            src/lapi.c
            src/lbaselib.c
            src/lua_cmsgpack.c
            src/ldebug.c
            src/lparser.c
            src/lua_cjson.c
            src/fpconv.c
            src/lua_bit.c
            src/llex.c
            src/ltm.c
            src/ldo.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")
    

    执行脚本mkreleasehdr.sh

    在编译之前,需要在Cygwin64 Terminal上执行 src/mkreleasehdr.sh 脚本,由于该脚本格式是win格式,所以需要执行dos2unix命令转换,转换完之后再执行。

    ##转换格式 
    dos2unix mkreleasehdr.sh 
    ##执行mkreleasehdr.sh 
    ./mkreleasehdr.sh
    

    把cmake-build-debug\deps\hiredis\cyghiredis.dll拷贝到
    cmake-build-debug\目录下。


    image.png

    启动调试

    image.png

    添加一行代码,并下个断点测试:


    image.png

    测试成功,断点命中并且打印出测试一下


    到此为止,redis的调试环境就搭建完成了,可以使用redis客户端程序连接测试一下。

    相关文章

      网友评论

          本文标题:Redis6.0源码分析(一)调试环境搭建

          本文链接:https://www.haomeiwen.com/subject/bfbliktx.html