Redis6 源码调式

Redis6 源码调式

安装Cygwin

1、下载安装Cygwin

去Cygwin的官方网站http://www.cygwin.com/

window 64位请选择 setup-x86_64.exe 32位请选择 setup-x86.exe下载完成后,运行setup.exe程序,出现安装画面,如下图所示:

Redis6 源码调式Redis6 源码调式Redis6 源码调式

上面步骤建议默认下一步。

2、关键步骤

在这一步,需要注意,为了获得最快的下载速度提供三个下载地址

这里以163镜像为例,选择完成后,点击”下一步”,

Redis6 源码调式Redis6 源码调式

接下来选择安装的软件,Search处分别搜索 gcc-core、gcc-g++、make、gdb、binutils,

选择devel目录下的相关版本,选择Reinstall重新下载。

Redis6 源码调式

然后下一步,下一步,就看各位网速了,静等下载成功。

3、验证Cygwin是否安装成功

运行cygwin,在弹出的命令行窗口输入:cygcheck -c cygwin

Redis6 源码调式

还要安装一个apt-cyg(相当于是linux下的yum,cygwin下没有yum命令)

安装了apt-cyg就能向使用Ubuntu一样使用apt-get install/remove命令安装卸载软件了,非常方便。GitHub下载脚本:https://github.com/transcode-open/apt-cyg

Redis6 源码调式

复制apt-cyg,粘贴到cygwin的安装目录的bin目录下,然后执行命令

Redis6 源码调式

然后在系统变量中添加配置

Redis6 源码调式

安装clion

CLion 是 JetBrains 推出的全新的 C/C++ 跨平台集成开发环境。习惯了用idea的java程序员用clion来调试redis源码应该比较舒适,比起vc要舒服多了。

Redis6 源码调式

Clion中导入redis源码

导入Reids源码之前,需要添加一个CMakeLists.txt

/CMakeLists.txt
./deps/CMakeLists.txt
./deps/linenoise/CMakeLists.txt
./deps/lua/CMakeLists.txt
./src/modules/CMakeLists.txt

/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/linenoise/CMakeLists.txt

add_library(linenoise linenoise.c)

./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")

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

转换格式

dos2unix mkreleasehdr.sh

执行mkreleasehdr.sh

./mkreleasehdr.sh

编译&调试redis6源码

1)、redis6源码加载之后,cmake会自动编译,编译完成后,选择redis-server|debug选项,点击【运行】即可

Redis6 源码调式
  1. 如果想断点的话,要下载一个reids-cli的windows客户端。 Redis6 源码调式

断点结果如下:

Redis6 源码调式

Original: https://www.cnblogs.com/dalianpai/p/15791225.html
Author: 天宇轩-王
Title: Redis6 源码调式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528880/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 版本控制gitlab

    版本控制gitlab 版本控制gitlab 版本控制介绍 常用的版本控制工具: gitlab部署 gitlab网页界面的基本使用 使用命令行的方式进行上传文件 版本控制介绍 版本控…

    Linux 2023年6月6日
    0117
  • Linux 系统安全加固经验总结

    本文为博主原创,转载请注明出处: 1. 禁止root密码登录 修改 /etc/ssh/sshd_config 中 允许root 用户登录 PermitRootLogin 的值改为 …

    Linux 2023年6月14日
    092
  • Centos7 禁用IPV6地址的方法

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    071
  • 非常实用的 Shell 脚本

    检测两台服务器指定目录下的文件一致性 #!/bin/bash<br>#####################################<br>#&a…

    Linux 2023年5月28日
    067
  • MySQL常见问题以及解决方法

    MySQL常见问题以及解决方法 数据损坏或丢失 serverid不唯一 主从节点存在复制延迟 主从节点数据不一致 数据表主键冲突 数据损坏或丢失 Master:采用MHA+semi…

    Linux 2023年6月7日
    099
  • 【MQTT】阿里云搭建MQTT物联网平台通信

    MQTT环境搭建和测试 物联网环境搭建 MQTT.fx使用 物联网环境搭建 1.首先进入阿里云官网注册并登录你的账号。2.点击控制台。3.在产品与服务下面搜索物联网平台4.点击公共…

    Linux 2023年6月13日
    080
  • phpcmsv9 后台统计编辑发稿数量

    直切正题: 每个人,每个栏目,发稿数量统计 SELECT a.realname AS 姓名, c.catname AS 栏目名称, count(1) AS 发稿量FROM v9_n…

    Linux 2023年6月13日
    089
  • JavaScript 做的网页版扫雷小游戏

    闲来无事做了个网页版扫雷小游戏,基本实现了扫雷客户端的全部功能。但是感觉面向对象用的还不是很好,有待优化。 游戏地址:http://twgdh.com/saolei/index.h…

    Linux 2023年6月13日
    0108
  • Java秒杀系统二:Service层

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    093
  • Linux系统编程之文件IO

    前言 在学习C语言时,我们接触过如fopen、fclose、fseek、fgets、fputs、fread、fwrite等函数,实际上,这些函数是对于底层系统调用的封装。C默认会打…

    Linux 2023年6月8日
    085
  • KMP分析证明

    引用后缀的目的: “ABBABA” 如果说ABA里面组成的AB是答案组成部分的开头,那么AB后面的字符一定是和模式串开头的第三个字符一样,如果不一样一定不是…

    Linux 2023年6月7日
    062
  • Java分布式集群,使用synchronized和Redis保证Job的原子性

    1.使用synchronized保证并发时,同时只会有一个请求执行该代码段; 2.在执行前先设置并获取Reids标记,先设置然后获取确保是否已经执行;SetOption.SET_I…

    Linux 2023年5月28日
    089
  • 手把手搭建一个属于自己的在线 IDE

    背景 这几个月在公司内做一个跨前端项目之间共享组件/区块的工程,主要思路就是在 Bit 的基础上进行开发。Bit 主要目的是实现不同项目 共享 与 同步 组件/区块,大致思路如下:…

    Linux 2023年6月14日
    0102
  • cdn缓存顺序优先级

    posted @2022-09-26 17:28 爱折腾的大臭臭 阅读(10 ) 评论() 编辑 Original: https://www.cnblogs.com/linuxsh…

    Linux 2023年6月6日
    0105
  • MySQL之存储引擎、基本数据类型及约束条件

    一、存储引擎 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,…

    Linux 2023年6月14日
    081
  • Linux中的RCU机制

    什么是RCU? RCU(Read-Copy Update),顾名思义就是读-拷贝-修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写…

    Linux 2023年6月13日
    0105
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球