Linux调试器-gdb使用

目录

一、gdb的使用

二、查看可执行程序的信息(readelf)

三、gdb常用的指令

[1. 显示源代码(list/l)](#1. 显示源代码(list/l))

[2. 运行程序(r或run)](#2. 运行程序(r或run))

[3. 在某一行设置断点(b指令)](#3. 在某一行设置断点(b指令))

[4. 显示断点(info b)](#4. 显示断点(info b))

[5. 删除断点](#5. 删除断点)

[6. 调试(r)](#6. 调试(r))

[7. 禁止和启用断点(disable和enable)](#7. 禁止和启用断点(disable和enable))

[8. 单条执行(逐过程执行)(n 或 next)](#8. 单条执行(逐过程执行)(n 或 next))

[9. 进入函数调用(s或step)](#9. 进入函数调用(s或step))

[10. 打印变量值(p)](#10. 打印变量值(p))

[11. 长期监视/取消监视变量的值(display指令/undisplay指令)](#11. 长期监视/取消监视变量的值(display指令/undisplay指令))

[12. 跳至指定行](#12. 跳至指定行)

[13. 运行到当前函数的结尾(finish)](#13. 运行到当前函数的结尾(finish))

[14. 从一个断点直接运行到下一个断点处(c)](#14. 从一个断点直接运行到下一个断点处(c))

[15. 显示调用堆栈(bt)](#15. 显示调用堆栈(bt))

[16. 修改变量的值:set var](#16. 修改变量的值:set var)

[17. 显示当前函数内临时变量:info locals](#17. 显示当前函数内临时变量:info locals)


一、gdb的使用

  • 在 Linux 中使用默认的编译器进行代码编译时,会采用 release 模式
  • 要生成带有调试信息的可执行文件,您需要在编译命令中添加-g选项,这样生成的程序就是 debug 版本
  • debug版本发布的可执行程序的大小比release版本发布的可执行程序的大小要大一点,因为以debug版本发布的可执行程序内部包含了更多的调试信息

二、查看可执行程序的信息(readelf)

  • readelf 是一个在 Linux 系统中可以用来查看 ELF(可执行与可链接格式)文件信息
cpp 复制代码
readelf -S mybin_g //命令用于查看 ELF 文件 mybin_g 的节头表信息
                   //包括名称、类型、大小、地址、偏移等
cpp 复制代码
readelf -S mybin_g | grep -i debug//使用 readelf -S mybin_g 列出了所有节的信息
//通过管道 | 将输出传递给 grep -i debug 命令,其中 grep 是用于在文本中搜索指定模式的命令
//而 -i 选项表示忽略大小写

三、gdb常用的指令

1. 显示源代码(list/l)

2. 运行程序(r或run)

3. 在某一行设置断点(b指令)

cpp 复制代码
b 18//在第18行设置断点

4. 显示断点(info b)

5. 删除断点

  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • 可以简写成d

6. 调试(r)

7. 禁止和启用断点(disable和enable)

  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点

8. 单条执行(逐过程执行)(n 或 next)

9. 进入函数调用(s或step)

10. 打印变量值(p)

11. 长期监视/取消监视变量的值(display指令/undisplay指令)

12. 跳至指定行

cpp 复制代码
until 11//跳转到11行

13. 运行到当前函数的结尾(finish)

14. 从一个断点直接运行到下一个断点处(c)

15. 显示调用堆栈(bt)

16. 修改变量的值:set var

cpp 复制代码
set var i=100

17. 显示当前函数内临时变量:info locals

相关推荐
信创DevOps先锋5 分钟前
Gitee:中国开发者生态的数字化转型基石与创新加速器
运维·gitee·devops
Crazy CodeCrafter22 分钟前
房租年年涨,客流年年少,服装店还要开吗?
大数据·运维·微信·自动化·开源软件
淼淼爱喝水26 分钟前
Ansible 配置与环境搭建超全教程(自动化运维基础)
运维·自动化·ansible
xlp666hub33 分钟前
深度剖析Linux Input子系统(2):驱动开发流程与现代 Multi-touch 协议
linux
AI-Ming33 分钟前
程序员转行学习 AI 大模型: 踩坑记录:服务器内存不够,程序被killed
服务器·人工智能·python·gpt·深度学习·学习·agi
yj_xqj1 小时前
HAproxy负载均衡集群部署
运维·负载均衡
路由侠内网穿透1 小时前
本地部署开源工作空间工具 AFFiNE 并实现外部访问
运维·服务器·数据库·物联网·开源
zzzsde1 小时前
【Linux】Ext文件系统(1)
linux·运维·服务器
爱学习的小囧1 小时前
ESXi 8.0 无法选择分区方式 小白级详细解决办法
运维·服务器·网络·虚拟化·esxi8.0
F1FJJ1 小时前
什么是 Shield CLI?视频讲解:一条命令,可浏览器远程访问一切内部服务(RDP/VNC/SSH/数据库等)
运维·网络·数据库·网络协议·ssh