mac系统使用 clion远程调试redis4源码
远程主机使用 linux 系统。
第一步肯定就是在本地和远程主机上建立代码同步机制了——sftp首选。
第二步是编写redis4的CMakeLists.txt 文件,在mac系统 clion调试 redis4 源码 有完整的CMakeLists.txt。可以拿来使用,这里就不再写了。
第三步就是在远程主机上构建项目并且make编译,然后使用 gdbserver :port src/redis-server
最后一步就是在clion中新建 gdb remote debug
,在其他笔记中也有相关介绍,这里同样不做赘述。
主要需要说明的是第三步,在构建和编译中会出现各种各样的问题。
- cmake 版本, 因为我们在CMakeLists.txt 中指定了cmake需要的最低版本。默认情况下linux远程主机中的cmake版本可能比较低,所以需要升级 cmake 版本。
- 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
很好,成功了。
尽情在调试中畅游吧!
相关文章
如何使用 Node.js 在 Redis Cloud 上存储和检索 RedisJSON
发布时间:2022/09/07 浏览次数:90 分类:学无止境
-
在过去的几个月里,我一直在使用 Redis 数据库来管理我的一些应用程序,随着应用程序的扩展,我发现我正在使用更多的 Redis 功能。其中一项功能是 **Redis Stack**。在深入了解 Redis Sta
如何使用 Bucket4J 和 Redis 创建频率限制器
发布时间:2022/04/11 浏览次数:452 分类:学无止境
-
在本教程中,我们将学习如何在扩展服务中实现频率限制。我们将使用 Bucket4J 库来实现它,我们将使用 Redis 作为分布式缓存。
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 文件
Redis 在 centos下安装方法及常见问题解决
发布时间:2017/08/18 浏览次数:936 分类:Redis
-
本篇我们来介绍一下如何在Centos下安装redis。其实,安装步骤很简单,只是中间可能会出现一些问题,这是值得我们所关注的。
自定义的PHPRedis操作类使用介绍
发布时间:2016/05/12 浏览次数:608 分类:PHP
-
PHP封装了一个Redis的操作类,其中涉及的函数command、exec、result、get_errinfo等。本篇分别介绍了如何使用这些函数。
Redis密码验证命令AUTH
发布时间:2016/05/11 浏览次数:5154 分类:Redis
-
Redis在安全方面并没有做太大的优化,而是在性能和易用性方面下了很大的功夫。Redis一个很简单的安全方式就是密码验证,这需要用到AUTH命令。