mac系统使用 clion远程调试redis4源码

远程主机使用 linux 系统。

第一步肯定就是在本地和远程主机上建立代码同步机制了——sftp首选。

第二步是编写redis4的CMakeLists.txt 文件,在mac系统 clion调试 redis4 源码 有完整的CMakeLists.txt。可以拿来使用,这里就不再写了。

第三步就是在远程主机上构建项目并且make编译,然后使用 gdbserver :port src/redis-server

最后一步就是在clion中新建 gdb remote debug ,在其他笔记中也有相关介绍,这里同样不做赘述。

主要需要说明的是第三步,在构建和编译中会出现各种各样的问题。

  1. cmake 版本, 因为我们在CMakeLists.txt 中指定了cmake需要的最低版本。默认情况下linux远程主机中的cmake版本可能比较低,所以需要升级 cmake 版本。

  2. cmake构建项目完成之后,使用make进行编译出现如下错误

$ make

......

/root/workspace/c/redis4/src/redis-cli.c:368:5: 错误:只允许在 C99 模式下使用‘for’循环初始化声明

for (size_t j = 0; j < reply->elements; j++) {

^

/root/workspace/c/redis4/src/redis-cli.c:368:5: 附注:使用 -std=c99 或 -std=gnu99 来编译您的代码

/root/workspace/c/redis4/src/redis-cli.c: 在函数‘LRUTestMode’中:

/root/workspace/c/redis4/src/redis-cli.c:2729:17: 错误:只允许在 C99 模式下使用‘for’循环初始化声明

for (int i = 0; i < 5; i++) val[i] = 'A'+rand()%('z'-'A');

^

make[2]: *** [CMakeFiles/redis-cli.dir/src/redis-cli.c.o] 错误 1

make[1]: *** [CMakeFiles/redis-cli.dir/all] 错误 2

make: *** [all] 错误 2

这个的原因是,在linux默认的C标准中是不允许直接在 for循环中声明变量的。只有在C99/gnu99标准中是允许的。所以需要指定 C99 标准。

修改redis4/CMakeLists.txt 文件为如下内容

cmake_minimum_required(VERSION 3.15)

project(redis4_1)

set(CMAKE_BUILD_TYPE "Debug")

set(CMAKE_C_FLAGS "-std=c99") ### 新增

......

新增一句代码,其他不变。

$ make

[ 93%] Building C object CMakeFiles/redis-server.dir/src/sparkline.c.o

[ 94%] Linking C executable src/redis-server

CMakeFiles/redis-server.dir/src/module.c.o:在函数‘moduleLoad’中:

/root/workspace/c/redis4/src/module.c:3935:对‘dlopen’未定义的引用

/root/workspace/c/redis4/src/module.c:3937:对‘dlerror’未定义的引用

/root/workspace/c/redis4/src/module.c:3940:对‘dlsym’未定义的引用

/root/workspace/c/redis4/src/module.c:3952:对‘dlclose’未定义的引用

CMakeFiles/redis-server.dir/src/module.c.o:在函数‘moduleUnload’中:

/root/workspace/c/redis4/src/module.c:3994:对‘dlclose’未定义的引用

/root/workspace/c/redis4/src/module.c:3995:对‘dlerror’未定义的引用

CMakeFiles/redis-server.dir/src/debug.c.o:在函数‘dumpX86Calls’中:

/root/workspace/c/redis4/src/debug.c:1011:对‘dladdr’未定义的引用

CMakeFiles/redis-server.dir/src/debug.c.o:在函数‘sigsegvHandler’中:

/root/workspace/c/redis4/src/debug.c:1078:对‘dladdr’未定义的引用

collect2: 错误:ld 返回 1

make[2]: *** [src/redis-server] 错误 1

make[1]: *** [CMakeFiles/redis-server.dir/all] 错误 2

make: *** [all] 错误 2

发现for循环问题解决了,然而新的问题又产生了。 对于这种dlxxxx 函数未定义的引用 问题,需要在编译的时候指定 -ldl

如何实现,同样是需要改 redis4/CMakeLists.txt文件。

......

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 m

PRIVATE lua

PRIVATE linenoise

PRIVATE hiredis

-ldl) ### 新增 -ldl 选项

文件其他内容不变。

$ rm -f CMakeCache.txt

$ cmake .

$ make

...

[ 97%] Linking C shared library helloblock.so

[ 97%] Built target helloblock

[ 98%] Building C object src/modules/CMakeFiles/hellotype.dir/hellotype.c.o

[ 99%] Linking C shared library hellotype.so

[ 99%] Built target hellotype

[ 99%] Building C object src/modules/CMakeFiles/helloworld.dir/helloworld.c.o

[100%] Linking C shared library helloworld.so

[100%] Built target helloworld

很好,成功了。

尽情在调试中畅游吧!

本文转载自:迹忆客(https://www.jiyik.com)

以上是 mac系统使用 clion远程调试redis4源码 的全部内容, 来源链接: utcz.com/z/290172.html

回到顶部