基于Gdb快速上手调试Redis

写在文章开头

近期很多读者有询问有没有什么简单的办法快速上手调试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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python深度学习系列】网格搜索神经网络超参数:批量大小和迭代周期数(案例+源码)

这是我的第297篇原创文章。 一、引言 在深度学习中&#xff0c;超参数是指在训练模型时需要手动设置的参数&#xff0c;它们通常不能通过训练数据自动学习得到。超参数的选择对于模型的性能至关重要&#xff0c;因此在进行深度学习实验时&#xff0c;超参数调优通常是一个重要的…

在线Logo背景去除:pixian.ai

文章目录 简介特色 简介 pixian.ai是一款智能图片背景去除工具&#xff0c;进入网页后&#xff0c;会非常醒目地提示你准备【Free】还是【Paid】&#xff0c;这点就非常好&#xff0c;不向有一些网站&#xff0c;主打免费使用&#xff0c;但时不时弹出“免费注册”&#xff0c…

1782java英语陪学记词系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java英语陪学记词系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

RabbitMQ-工作模式(简单模式工作队列)

文章目录 简单模式&#xff08;simple&#xff09;工作队列&#xff08;work&#xff09;准备工作轮询调度消息确认消息持久性公平分发代码示例 本篇总结 更多相关内容可查看 简单模式&#xff08;simple&#xff09; 通俗概括:生产者-队列-消费者 想详细了解Rabbit的基础或简…

ESD防护SP3232E真+3.0V至+5.5V RS-232收发器

特征 采用3.0V至5.5V电源&#xff0c;符合真正的EIA/TIA-232-F标准 满载时最低 120Kbps 数据速率 1μA 低功耗关断&#xff0c;接收器处于活动状态 &#xff08;SP3222E&#xff09; 可与低至 2.7V 电源的 RS-232 互操作 增强的ESD规格&#xff1a; 15kV人体模型 15kV IEC1000…

软件杯 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

计算机毕业设计Spark+Flink+Hive地铁客流量预测 交通大数据 地铁客流量大数据 交通可视化 大数据毕业设计 深度学习 机器学习

项目说明​ ​ 1该项目主要分析通刷卡数据&#xff0c;通过大数据技术来研究地铁客运能力及探索优化服务的方向​ 2主要讲解Flink流处理实时分析部分&#xff0c;离线部分较简单&#xff0c;暂时略过​ ​ 技术架构​ ​项目流程&#xff1a;​ 采用python请求深圳地铁数…

70 Realistic Mountain Environment Textures Cliff(70+张真实的山地环境纹理)

大量适合山区和其他岩石环境的纹理--悬崖、岩石、砾石等等 每个纹理都是可贴的/无缝的,并且完全兼容各种不同的场景--标准Unity地形、Unity标准着色器、URP、HDRP等等都兼容。 所有的纹理都是4096x4096,并包括一个HDRP掩码,以完全支持HDRP。 特点。 70种质地 70种材料 70个地…

基于springboot实现农产品直卖平台系统项目【项目源码+论文说明】

基于springboot实现农产品直卖平台系统的设计演示 摘要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔…

内网快速传输工具

常见的有LANDrop&#xff0c;支持多种设备&#xff0c;如电脑、pad、手机等等之间互传。但本文介绍的这款是很小的电脑间互传工具。 特点是非常的快速&#xff0c;文件很小&#xff0c;不用安装解压就可用。

transformers peft加载lora模型;TextStreamer流式输出,kv cache使用

1、transformers peft加载lora模型 https://github.com/hiyouga/LLaMA-Factory/blob/cae47379079ff811aa385c297481a27020a8da6b/scripts/loftq_init.py#L13 代码&#xff1a; from peft import AutoPeftModelForCausalLM, PeftModel from transformers import AutoTokenizer…

《手把手教你》系列练习篇之13-python+ selenium自动化测试 -压轴篇(详细教程)

1. 简介 “压轴”原本是戏曲名词&#xff0c;指一场折子戏演出的倒数第二个剧目。在现代社会中有很多应用&#xff0c;比如“压轴戏”&#xff0c;但压轴也是人们知识的一个盲区。“压轴”本意是指倒数第二个节目&#xff0c;而不是人们常说的倒数第一个&#xff0c;倒数第一个…

Incredibuild for Mac 来了!

Mac 开发者在寻找适合自己需求的工具时可能会遇到一些困难&#xff0c;因为 Mac 操作系统相对封闭&#xff0c;不像其他系统那样开放和灵活。尽管如此&#xff0c;Mac 开发者在开发应用程序时的需求&#xff08;比如功能、效率等&#xff09;和使用其他操作系统的开发者是类似的…

C++ - 查找算法 和 其他 算法

目录 一. 查找算法&#xff1a; 1.顺序查找&#xff1a; 2.二分查找&#xff1a; 二. 其他算法&#xff1a; 1.遍历算法&#xff1a; 2.求和、求平均值等聚合算法。 a.求和算法&#xff1a; b.求平均值算法&#xff1a; 一. 查找算法&#xff1a; 1.顺序查找&#xff1…

如何访问内网数据库?

现如今&#xff0c;随着信息化的不断发展&#xff0c;数据库已经成为了企业管理和数据存储的重要组成部分。由于安全等原因&#xff0c;很多公司和组织将自己的数据库部署在内网中&#xff0c;限制了外部的访问。有些情况下&#xff0c;我们仍然需要在外部网络环境中访问内网的…

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

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

:长亭雷池社区版动态防护体验测评

序 长亭雷池在最近发布了动态防护功能&#xff0c;据说可以动态加密保护网页前端代码和阻止爬虫行为、阻止漏洞扫描行为等。今天就来体验测试一下 WAF 是什么 WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。区别于传统防火墙&#xff0c;WAF …

Error:..\FreeRTOS\portable\RVDS\ARM_CM7\r0p1\port.c,265

移植完FreeRTOS后&#xff0c;使用Keil进行编译&#xff0c;编译未报错&#xff0c;串口打印助手打印了错误报告。 串口打印的错误报告&#xff1a; Error:..\FreeRTOS\portable\RVDS\ARM_CM7\r0p1\port.c,265看一下265行 该行所在函数为prvTaskExitError函数&#xff0c;功能…

阅读笔记:Multi-threaded Rasterization in the Chromium Compositor

Multi-threaded Rasterization in the Chromium Compositor PPT 原始链接&#xff1a; https://docs.google.com/presentation/d/1nPEC4YRz-V1m_TsGB0pK3mZMRMVvHD1JXsHGr8I3Hvc/edit?uspsharing PPT主要介绍了Chromium浏览器中使用多线程光栅化(Impl-side painting)的机制&a…

目标检测——FGVC-Aircraft数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …