Redis6.0源碼分析(一)調(diào)試環(huán)境搭建

本系列課程講解Redis6.0的源碼增蹭,為了讓大家能更好的對c語言的Redis源碼上手滴某,我們選擇在Windows下使用debug環(huán)境閱讀源碼(感謝Smart哥的友情分享),下面我們就開始搭建環(huán)境滋迈。

安裝配置cygwin

Cygwin是一個在windows平臺上運行的類UNIX模擬環(huán)境霎奢,可以讓我們在windows下模擬Linux下的命令
1.下載https://cygwin.com/setup-x86_64.exe (64位)版本或者https://cygwin.com/setup-x86.exe (32位版本)
2.點擊下一步,這一步一定要選擇Direct Connection

image.png

接下來饼灿,添加網(wǎng)易的鏡像站
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
復(fù)制apt-cyg窗骑,粘貼到cygwin的安裝目錄的bin目錄下。

image.png

打開Cygwin漆枚,輸入命令:

##該命令后面會用到 
apt-cyg install dos2unix

CLion導(dǎo)入項目

CLion 是 JetBrains 推出的全新的 C/C++ 跨平臺集成開發(fā)環(huán)境创译,對于習(xí)慣使用IDEA開發(fā)Java項目的程序員們來說是一個福音,安裝方式略(與IDEA相同)墙基。


image.png

選擇此選項软族,導(dǎo)入redis 6.0項目刷喜,導(dǎo)入之后會自動生成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")

執(zhí)行腳本mkreleasehdr.sh

在編譯之前立砸,需要在Cygwin64 Terminal上執(zhí)行 src/mkreleasehdr.sh 腳本掖疮,由于該腳本格式是win格式,所以需要執(zhí)行dos2unix命令轉(zhuǎn)換颗祝,轉(zhuǎn)換完之后再執(zhí)行浊闪。

##轉(zhuǎn)換格式 
dos2unix mkreleasehdr.sh 
##執(zhí)行mkreleasehdr.sh 
./mkreleasehdr.sh

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


image.png

啟動調(diào)試

image.png

添加一行代碼螺戳,并下個斷點測試:


image.png

測試成功搁宾,斷點命中并且打印出測試一下


到此為止,redis的調(diào)試環(huán)境就搭建完成了倔幼,可以使用redis客戶端程序連接測試一下盖腿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市损同,隨后出現(xiàn)的幾起案子翩腐,更是在濱河造成了極大的恐慌,老刑警劉巖膏燃,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茂卦,死亡現(xiàn)場離奇詭異,居然都是意外死亡蹄梢,警方通過查閱死者的電腦和手機疙筹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來禁炒,“玉大人而咆,你說我怎么就攤上這事∧桓ぃ” “怎么了暴备?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長们豌。 經(jīng)常有香客問我涯捻,道長,這世上最難降的妖魔是什么望迎? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任障癌,我火速辦了婚禮,結(jié)果婚禮上辩尊,老公的妹妹穿的比我還像新娘涛浙。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布轿亮。 她就那樣靜靜地躺著疮薇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪我注。 梳的紋絲不亂的頭發(fā)上按咒,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音但骨,去河邊找鬼励七。 笑死,一個胖子當(dāng)著我的面吹牛奔缠,可吹牛的內(nèi)容都是我干的呀伙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼添坊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箫锤?” 一聲冷哼從身側(cè)響起贬蛙,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谚攒,沒想到半個月后阳准,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡馏臭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年野蝇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片括儒。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡绕沈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帮寻,到底是詐尸還是另有隱情乍狐,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布固逗,位于F島的核電站浅蚪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏烫罩。R本人自食惡果不足惜惜傲,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贝攒。 院中可真熱鬧盗誊,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痢站,卻和暖如春鳍怨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哑子。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工舅列, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卧蜓。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓帐要,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弥奸。 傳聞我的和親對象是個殘疾皇子榨惠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355