本系列課程講解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
接下來饼灿,添加網(wǎng)易的鏡像站
我們需要安裝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目錄下。
打開Cygwin漆枚,輸入命令:
##該命令后面會用到
apt-cyg install dos2unix
CLion導(dǎo)入項目
CLion 是 JetBrains 推出的全新的 C/C++ 跨平臺集成開發(fā)環(huán)境创译,對于習(xí)慣使用IDEA開發(fā)Java項目的程序員們來說是一個福音,安裝方式略(與IDEA相同)墙基。
選擇此選項软族,導(dǎo)入redis 6.0項目刷喜,導(dǎo)入之后會自動生成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/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\目錄下。
啟動調(diào)試
添加一行代碼螺戳,并下個斷點測試:
測試成功搁宾,斷點命中并且打印出測試一下
到此為止,redis的調(diào)試環(huán)境就搭建完成了倔幼,可以使用redis客戶端程序連接測試一下盖腿。