迹忆客 专注技术分享

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

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

作者:迹忆客 最近更新:2022/12/12 浏览次数:

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

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

gdbserver 配合 Clion 实现远程调试

发布时间:2021/07/06 浏览次数:459 分类:编程语言

gdbserver 配合 Clion 实现远程调试,首先使用clion新建项目,并且对其进行设置,从而使其可以和远程机器进行代码同步。项目新建完成,并且也能和远程机器进行同步之后。开始将我们的

如何使用 CLion 开发调试 PHP 扩展

发布时间:2021/07/02 浏览次数:231 分类:PHP

php 扩展的创建这里就不再赘述,使用ext_skel 生成一个框架,然后编辑相应的文件,编译安装,最后在php.ini 配置文件中加入生成的扩展 例如 my_ext.so

如何在mac系统下使用clion调试redis源码

发布时间:2021/04/29 浏览次数:378 分类:Redis

本篇主要介绍在mac系统下如何使用clion调试redis的源码。clion主要使用的是`cmake` + `make` 进行编译。所以对于redis4来说,主要的就是先编写 CMakeLists.txt 文件

自定义的PHPRedis操作类使用介绍

发布时间:2016/05/12 浏览次数:608 分类:PHP

PHP封装了一个Redis的操作类,其中涉及的函数command、exec、result、get_errinfo等。本篇分别介绍了如何使用这些函数。

Redis密码验证命令AUTH

发布时间:2016/05/11 浏览次数:5154 分类:Redis

Redis在安全方面并没有做太大的优化,而是在性能和易用性方面下了很大的功夫。Redis一个很简单的安全方式就是密码验证,这需要用到AUTH命令。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便