【Linux系统化学习】开发工具——gdb(调试器)

=========================================================================

个人主页点击直达:****小白不是程序媛

Linux专栏:Linux系统化学习

个人仓库:Gitee

=========================================================================

目录

前言:

gdb版本检查和安装

Debug和Release

gdb的使用

其他指令


前言:

前几篇文章分别介绍了在Linux下的代码编辑器、编译器。在编写代码时难免会遇到一些Bug需要我们手动去调试我们的代码片段,在Windows系统下的集成化开发环境我们可能使用某个快捷键就可以进入调试,但是在没有可视化图标的Linux下我们要使用我们的调试器gdb进行调试。


gdb版本检查和安装

版本检查

通过指令判断你的版本和是否安装gdb

  • gdb --version

安装

  • yum install -y gdb

Debug和Release

我们知道我们编写的代码会有Debug和Release 两个版本;Debug版本是我们程序员在实现某一个项目时使用的版本,可以进行各种调试;而Release版本时我们项目完成后,用户使用项目时的版本,不可以调试并且系统会做优化

在Windows下的集成开发环境默认为Debug版本,而在Linux下默认为Relase版本。

如何证明在Linux下默认为Release版本呢?

  • 通过能否调试判断为Debug还是Release,Debug可以调试Release不可以调试。
复制代码
  1 #include<stdio.h>
  2 int Sum(int n)
  3 {
  4     int i=0;
  5     int sum=0;
  6     for(i=1;i<=n;i++)
  7     {
  8         sum+=i;
  9     }
 10     return sum;
 11 }
 12 int main()
 13 {
 14     int n=100;
 15     int ret=Sum(n);
 16     printf("%d \n",ret);                                                                                                                             
 17     return 0;
 18 }

我们在Linux下编写这样一段代码进行测试。

  • 通过判断可执行程序的大小判断; Debug系统没有优化比较大,Release系统优化比较小;

因为Debug 版本会添加调试信息,所以Debug版本文件会比Release版本大。

通过查看Debug版本和Release版本的文件信息判断,上面说到Debug版本会添加调试信息;而Linux我们的可执行程序是ELF格式,我们可以通过这一点配合查询和管道在我们的Debug版本下查找是否有Debug的内容。


gdb的使用

  • gdb 可执行程序文件名
  • 退出: ctrl + d 或 quit 调试命令
  • l 行号/函数名:从指定行号/函数开始打印10行 (不是输入行号/函数名从默认位置打印10行
  • break(b):打断点
  • info break :查看断点信息
  • disable:关闭断点
  • enable:启用断点
  • c :跳转到下个断点
  • d 断点编号:删除断点(不可以通过行号删除)
  • r :运行程序
  • s :逐语句执行
  • n:逐过程执行
  • finish :运行至当前函数结尾

其他指令

  • diaplay 变量名:追踪查看变量,显示变量所有信息
  • undisplby 变量名:取消追踪
  • until 行号:跳转到X行
  • bt :调用堆栈
  • break 函数名:在某个函数开头设置断点
  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量:打印变量值。
  • set var:修改变量的值
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • info(i) locals:查看当前栈帧局部变量的值

Linux下包括软件的安装(yum)、代码编辑(vim多模式编辑器)、代码编译(gcc/g++编译器)、代码调试(gdb),自动化构建代码(make/makefile),这五种开发工具就介绍完了。每个开发工具多多少少都会有一些指令,不用可以去记忆这些指令,可以的去用指令刻意练习,慢慢就会熟练使用指令。今天的分享到这里就结束了,如果觉得文章还不错的话,可以三连支持一下,您的支持就是我前进的动力!


下篇预告------冯诺依曼体系结构

相关推荐
腾渊信息科技公司4 小时前
工业数据运维痛点根治方案:基于AI Agent的产线自动化台账系统落地
运维·人工智能·自动化·个人开发·ai编程
Dxy12393102164 小时前
Proxy Protocol v2 详解
运维
踏月的造梦星球5 小时前
DMDPC 学习:架构、部署、运维与调优
运维·数据库·学习·架构
潘正翔5 小时前
docker核心概念
linux·运维·服务器·docker·容器·centos·运维开发
weigangwin5 小时前
agent-workspace-linux 不是远程桌面:Linux AI 工作区的隔离边界验收
linux·xvfb·mcp·桌面隔离·权限边界·bubblewrap·agent-workspace
renhongxia16 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
Dovis(誓平步青云)7 小时前
远程办公软件文件传输实测:6 款工具的速度、稳定性和办公体验对比
linux·运维·服务器·后端·生成对抗网络
专注_每天进步一点点7 小时前
SLB(绑定弹性公网ip)-gateway-业务pod,gateway上出现reset by peer,业务pod上没有reset by peer
服务器·tcp/ip·gateway
GHL2842710907 小时前
unreferenced formal parameter 解决办法学习
学习
Java小白笔记8 小时前
Docker 安装配置完全指南:MacOS 、Windows、Linux环境下的安装、配置与验证
linux·macos·docker