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
很好,成功了。
尽情在调试中畅游吧!
本文转载自:迹忆客(https://www.jiyik.com)
以上是 mac系统使用 clion远程调试redis4源码 的全部内容, 来源链接: utcz.com/z/290172.html