目录
[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