基于Gdb快速上手调试Redis

news2024/11/26 21:28:39

写在文章开头

近期很多读者有询问有没有什么简单的办法快速上手调试redis,对此,笔者用到了Linux系统中比较易上手的调试工具GDB,本文将基于一个C语言两数交换的例子演示一下这款工具的使用。

在这里插入图片描述

Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili

因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

在这里插入图片描述

详解GDB调试C代码过程

系统环境前置确认

请先确认自己Linux服务器是否完成对g++gdbmake等工具的安装,因为笔者系统上安装的Ubuntu系统,所以对应的检查和安装指令如下:

sudo apt-get update
sudo apt install g++ gdb make ninja-build rsync zip

两数交换代码示例

接下来便是编写C语言代码了,笔者这里给出一个两数交换的例子test.c文件,可以看到传入两个变量的指针,通过swap函数完成两数交换

#include <stdio.h>



int main(void)
{
	// 声明变量
      int num1 = 10;
      int num2 = 20;
	//打印交换前的结果
      printf("before swap num1 = %d, num2 = %d\n", num1, num2);
	//传入两个变量的地址完成两数交换
      swap(&num1, &num2);
	//打印最终结果
      printf("after swap num1 = %d, num2 = %d\n", num1, num2);
      return 0;
}

//两数交换
void swap(int* x, int* y)
{
      int tmp = *x;
      *x = *y;
      *y = tmp;
}

我们通过gcc指令进行编译并生成可执行文件:

gcc -g  test.c -o test

随后我们通过./test运行一下可执行文件,可以看到两数成功完成交换,运行结果正常:

before swap num1 = 10, num2 = 20
after swap num1 = 20, num2 = 10

启动GDB调试代码

基于上述示例,我们可以通过gdb调试并了解这段代码的工作流程,操作方式也比较简单,我们只需键入gdb 可执行文件名,以笔者本次代码为例,就是gdb test,如果正确执行就会输出下面这段内容,此时我们就可以看到一大段的加载信息:

GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...
(gdb)

当然,此时如果想退出,我们直接键入q键即可:

在这里插入图片描述

如果你希望启动时不输出一大段文字,你也可以结合-q指令启动调试:

在这里插入图片描述

调试步骤演示

基于上述步骤我们进入调试模式,和IDE工具不同,终端调试工具无法一眼看到所有的代码,如果我们希望看到当前的代码信息,需要通过l即list指令,例如笔者当前希望看到前10行的代码信息,那么我们就可以键入list指令,此时我们就可以看到前10行代码内容了:

在这里插入图片描述

list模式下,如果我们希望看到后续的代码段,只需不断键入回车或者键入l即继续向下查看代码:

在这里插入图片描述

了解了这个过程基本源码查看思路之后,我们就可以正式进入调试步骤了,假设我们此时希望在第13行代码打断点,那么我们可以键入b 13

img_2.png

当然我们也支持通过函数名打断点,例如我们希望在swap函数上打断点,那么我们就可以键入b swap:

img_3.png

在这期间,我们可键入info b (info breakpoint)查看打到的断点:

在这里插入图片描述

对于不需要的断点,我们可以用d指令进行删除,例如断点2即对swap函数的断点我们不需要,可直接键入d 2完成断点删除:

在这里插入图片描述

完成基本断点配置后,我们直接键入r即可让代码跑起来,会直接执行到我们打断点的位置:

在这里插入图片描述

此时如果我们希望打印num1的数值,可以通过p命令查看:


(gdb) p num1
$1 = 10

对于指针地址查看,也是一样的道理,还是以p1为例,我们直接键入p &num1即可打印num1地址:

(gdb) p &num1
$2 = (int *) 0x7fffffffdfd0

此时我们的代码已经执行到swap函数了,如果我们希望查看其内部执行细节,可以直接键入s即step步入:

(gdb) s
swap (x=0x7fffffffdfd0, y=0x7fffffffdfd4) at test.c:22
22            int tmp = *x;

后续我们可以不断键入n即next让代码不断向下执行,在此期间我们可以结合上述说的p指令查看变量的变化:

在这里插入图片描述

如果我们希望结束当前层级的函数调用,可以直接键入finish,可以看到代码直接跳到swap函数后面:

在这里插入图片描述

完成代码调试后,我们不再想调试后面的代码,可直接键入ccontinue结束指令,如下所示,输出了当前程序的最终执行结果:

在这里插入图片描述

终端可视化TUI

上述操作在调试上没有全局的视角所以调试时很不直观,所以我们日常调试时可以键入tui选项(terminal ui)指令进行调试,这里笔者直接以redis为例,编译成功后直接进入src目录键入如下指令:

gdb -q -tui redis-server

最终呈现的调试界面就如下图所示,对应的指令上文已经介绍了这里就不多做赘述了:

在这里插入图片描述

小结

以上便是笔者对于gdb调试redis源码的快速上手教程,希望对你有帮助。

我是 sharkchiliCSDN Java 领域博客专家开源项目—JavaGuide contributor,我想写一些有意思的东西,希望对你有帮助,如果你想实时收到我写的硬核的文章也欢迎你关注我的公众号: 写代码的SharkChili
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

在这里插入图片描述

参考

Linux | 调试器GDB的详细教程【纯命令行调试】
:https://blog.csdn.net/Fire_Cloud_1/article/details/129213449

【Linux】GDB调试教程(新手小白)
:https://blog.csdn.net/lovely_dzh/article/details/109160337

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1796912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity DOTS技术(十二) SystemBase修饰及操作

文章目录 一.变量修饰容器二 . Native Container 分配器三.NativeArray的创建及释放四.线程阻塞释放容器五.只读容器六,安全检查开关七.实体操作八.更优的实体操作方式 一.变量修饰容器 在上节中我们讲到多线程操作,为避免对线程的操作导致数据错乱,我们需要为变量进行修饰.于…

Python开发运维:VSCode与Pycharm 部署 Anaconda虚拟环境

目录 一、实验 1.环境 2.Windows 部署 Anaconda 3.Anaconda 使用 4.VSCode 部署 Anaconda虚拟环境 5.Pycharm 部署 Anaconda虚拟环境 6.Windows使用命令窗口版 Jupyter Notebook 7.Anaconda 图形化界面 二、问题 1.VSCode 运行.ipynb代码时报错 2.pip 如何使用国内…

C++开发基础之初探CUDA计算环境搭建

一、前言 项目中有使用到CUDA计算的相关内容。但是在早期CUDA计算环境搭建的过程中&#xff0c;并不是非常顺利&#xff0c;编写此篇文章记录下。对于刚刚开始研究的你可能会有一定的帮助。 二、环境搭建 搭建 CUDA 计算环境涉及到几个关键步骤&#xff0c;包括安装适当的 C…

【C++】 使用CRT 库检测内存泄漏

CRT 库检测内存泄漏 一、CRT 库简介二、CRT 库的使用1、启用内存泄漏检测2、设置应用退出时显示内存泄漏报告3、丰富内存泄漏报告4、演示使用 内存泄漏是 C/C 应用程序中最微妙、最难以发现的 bug&#xff0c;存泄漏是由于之前分配的内存未能正确解除分配而导致的。 最开始的少…

MySQL主从同步优化指南:架构、瓶颈与解决方案

前言 ​ 在现代数据库架构中&#xff0c;MySQL 主从同步是实现高可用性和负载均衡的关键技术。本文将深入探讨主从同步的架构、延迟原因以及优化策略&#xff0c;并提供专业的监控建议。 MySQL 主从同步架构 ​ 主从复制流程&#xff1a; 从库生成两个线程&#xff0c;一个…

如何替换fmod studio的.bank文件内的音效?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【Java毕业设计】基于JavaWeb的旅游论坛管理系统

文章目录 摘 要目 录1 概述1.1 研究背景及意义1.2 国内外研究现状1.3 拟研究内容1.4 系统开发技术1.4.1 Java编程语言1.4.2 vue技术1.4.3 MySQL数据库1.4.4 B/S结构1.4.5 Spring Boot框架 2 系统需求分析2.1 可行性分析2.2 系统流程2.2.1 操作流程2.2.2 登录流程2.2.3 删除信息…

【微信小程序开发(从零到一)】——个人中心页面的实战项目(一)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

(ICLR,2024)HarMA:高效的协同迁移学习与模态对齐遥感技术

文章目录 相关资料摘要引言方法多模态门控适配器目标函数 实验 相关资料 论文&#xff1a;Efficient Remote Sensing with Harmonized Transfer Learning and Modality Alignment 代码&#xff1a;https://github.com/seekerhuang/HarMA 摘要 随着视觉和语言预训练&#xf…

Rhino-Grasshopper:小白从入门开始学习

前言&#xff1a; 小编在这里即将开启一个新系列学习课程&#xff0c;主要内容为基于Rhino的3D打印学习&#xff0c;具体包括Rhino中的Python使用&#xff0c;Grasshopper的功能&#xff0c;讲解视频会陆续更新在B站&#xff0c;希望大家多多支持&#xff01; 关于相关学习、…

list(二)和_stack_queue

嗨喽大家好&#xff0c;时隔许久阿鑫又给大家带来了新的博客&#xff0c;list的模拟实现&#xff08;二&#xff09;以及_stack_queue&#xff0c;下面让我们开始今天的学习吧&#xff01; list(二)和_stack_queue 1.list的构造函数 2.设计模式之适配器和迭代器 3.新容器de…

HTML静态网页成品作业(HTML+CSS)—— 保护环境环保介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

公检法部门保密网文件导出,这样做才是真正的安全又便捷

公检法是司法机关的核心组成&#xff0c;也是社会管理的重要组成&#xff0c;公检法部门的业务中涉及大量的居民数据、个人隐私、司法案件等信息&#xff0c;因此&#xff0c;数据的安全性至关重要。 根据我国法律要求&#xff0c;同时基于对数据的保护需要&#xff0c;我国的公…

Vue06-el与data的两种写法

一、el属性 用来指示vue编译器从什么地方开始解析 vue的语法&#xff0c;可以说是一个占位符。 1-1、写法一 1-2、写法二 当不使用el属性的时候&#xff1a; 两种写法都可以。 v.$mount(#root);写法的好处&#xff1a;比较灵活&#xff1a; 二、data的两种写法 2-1、对象式…

discuz点微同城源码34.7+全套插件+小程序前端

discuz点微同城源码34.7全套插件小程序前后端 模板挺好看的 带全套插件 自己耐心点配置一下插件 可以H5可以小程序

重磅就业报告前美股涨势消减,标普暂别纪录高位,英伟达盘中闪崩近6%,欧央行降息预期“退烧”,欧元跳涨

标普纳指创盘中历史新高后转跌&#xff0c;道指三连涨至近两周新高&#xff1b;芯片股指和台积电美股跌落纪录高位&#xff0c;英伟达三日收创历史新高后回落&#xff1b;游戏驿站盘中一度暴拉50%。中概股指回落&#xff0c;财报后蔚来收跌6.8%。欧央行会后&#xff0c;欧元盘中…

Dvws靶场

文章目录 一、XXE外部实体注入二、No-SQL注入三、Insecure Direct Object Reference四、Mass Assignment五、Information Disclosure六、Command Injection七、SQL注入 一、XXE外部实体注入 访问http://192.168.92.6/dvwsuserservice?wsdl&#xff0c;发现一个SOAP服务。在SO…

Golang | Leetcode Golang题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; func singleNumber(nums []int) int {single : 0for _, num : range nums {single ^ num}return single }

【微信小程序】页面事件

下拉刷新 上拉触底 上拉触底距离指的是触发上拉触底事件时&#xff0c;滚动条距离页面底部的距离。 可以在全局或页面的json配置文件中&#xff0c;通过onReachBottomDistance属性来配置上拉触底的距离。 小程序默认的触底距离是50x,在实际开发中&#xff0c;可以根据自己的需…

三石峰汽车生产厂的设备振动检测项目案例

汽车生产厂的设备振动检测项目 ----天津三石峰科技&#xff08;http://www.sange-cbm.com&#xff09; 汽车产线有很多传动设备需要长期在线运行&#xff0c;会出现老化、疲劳、磨损等问题&#xff0c;为了避免意外停机造成损失&#xff0c;需要加装一些健康监测设备&#xf…