Gdb调试

1 概述

当程序运行时出现问题时,通过GDB调试可以快速找到问题点,当然不是所有问题都能通过调试找到问题点。

在GCC编译程序时,需要加 -g参数,可以通过在-g选项后附加数字1、2或3来指定在代码中加入调试信息的多少。默认的级别是2(-g2),此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息。级别3(-g3)包含级别2中的所有调试信息,以及源代码中定义的宏。级别1(-g1)不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈转储之用。

如下程序:

**编译:**gcc -g demo.c -o demo

运行程序时,当输入a的值为0时,报如下错:

2 启动GDB

终端输入命令:gdb demo

若有参数gdb --args demoparameter1 parameter2 parameter3),当GDB提示符出现的时候,表明GDB已经做好准备进行调试了,现在可以通过run命令让程序开始在GDB的监控下运行,如下图:

输入:run

run 和 start 指令都可以用来在 GDB 调试器中启动程序,它们之间的区别是:

① 默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处;
②start 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。

如果进程已经运行,可以根据进程号启动:gdb --p pid

3 断点
断点命令:break,也可以简写为b

某一行进行打断点(第3行):b 3;
多个文件,对某个文件的某一行打断点:b demo.c:4,表示对demo.c文件4行打断点;
对函数打断点:b fun ,表示对fun()函数打断点
多个文件,对某个函数打断点:b demo.c:fun ;
查询断点:

查询所有断点:info b
查询第n个断点:info b n
条件断点:b demo.c:8 if Value = 10

删除断点:delete,简写d

删除所有的断点:delete break
删除某个断点 n为断点号:delete break n
删除设在n行的断点(多个文件与打断点一样):clear n
en/enable启用某个断点
dis/disable 禁用某个断点

4 .打印

打印断点处某变量值,用命令 p;

  • 16进制:p/x
  • 二进制:p/t

5. 单独调试

**单步调试:next ,简写为n,**一条一条简单语句执行。
单步调试:step,简写s,若在某个函数断点处,则进入此函数。
退出当前断点进入下一个断点,或继续运行。

命令:continue ,简写c
finish 退出进入的函数 ,并且打印函数返回时的堆栈地址和返回值及参数值等信息,回到上一层调用函数
until在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,可简写为u

until + 行号 运行至某行

call + 行数 + (参数)

调用程序中可见的函数,并传递参数

如:call gdb_test(66)

6. 显示源码

查看源码:list(l),默认显示10行

  • l 函数名
  • l 数组

7 .设置/查看变量值(set/show)

修改变量值:set 变量名=value

查看变量值:show 变量名

8. 查看堆栈信息

当程序崩溃可以使用,where命令,查看死在那个位置。
bt,查看函数栈

f/frame 切换到当前调用线程的指定堆栈

f 2 进入第2栈

9 .查看线程

i threads 【查看所有线程】

t num 【进入num线程】

thread 【查当前线程】

thread 2 【切换到第二个线程】

PS:注意总结记录。

相关推荐
kyle~5 分钟前
Linux系统优化---PREEMPT_RT机器人开发方向
linux·运维·机器人
独隅29 分钟前
在 Linux 上部署 TensorFlow 模型的全面指南
linux·运维·tensorflow
Strange_Head30 分钟前
《Linux系统编程篇》Linux Socket 网络编程02 (Linux 进程间通信(IPC))——基础篇
linux·运维·网络
yiwenrong39 分钟前
history 常见优化配置
linux
Joren的学习记录1 小时前
【Linux运维大神系列】Kubernetes详解7(k8s技术笔记3)
linux·运维·kubernetes
chenqianghqu2 小时前
ubuntu 22.04环境中安装goland
linux·运维·ubuntu
gwjcloud3 小时前
Frp内网穿透
linux·运维·服务器
MwEUwQ3Gx3 小时前
常见Linux权限提升笔记
linux·运维·笔记
ken22324 小时前
安装问题@ ubuntu 24.04 :efi 磁盘分区,挂载
linux·运维·ubuntu
数据知道4 小时前
claw-code 源码详细分析:`reference_data` JSON 快照——大型移植里「对照底稿」该怎么治理与演进?
linux·python·ubuntu·json·claude code