迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 >

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

作者:迹忆客 时间:2021/05/09 浏览次数:

远程主机使用 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

很好,成功了。

尽情在调试中畅游吧!

上一篇:如何在mac系统下使用clion调试redis源码

下一篇:没有了

除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处

本文地址:

迹忆客

专注技术分享,项目实战分享!

技术宅 乐于分享 7年编程经验
社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

热门文章

热门标签