GDB 基础知识及断点

说明:文章所有内容均截选自实验楼教程【GDB 简明教程】,教程里还有更多GDB调试技巧,感兴趣的点击教程即可查看~

一、GDB 基础知识

1.GDB 相关概念

GDB, 是 The GNU Project Debugger 的缩写, 是 Linux 下功能全面的调试工具。GDB 支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序。

2.GDB 的进入和退出

如果要调试程序,需要在 gcc 编译可执行程序时加上 -g 参数,首先我们编译 bugging.c 程序,生成可执行文件:

gcc -g -o bugging bugging.c

其中 -o 指定输出文件名, 实验楼的环境是 64 位的 Ubuntu 14.04,所以默认会编译为 64 位的程序。

输入 gdb bugging 进入 gdb 调试 bugging 程序的界面:

gdb bugging

在 gdb 命令行界面,输入run 执行待调试程序:

(gdb) run

在 gdb 命令行界面,输入quit 退出 gdb:

(gdb) quit

上述步骤的操作截图如下:

GDB 基础知识及断点_第1张图片
此处输入图片的描述

3.GDB 命令行界面使用技巧

命令补全

任何时候都可以使用 TAB 进行补全,如果只有一个待选选项则直接补全;否则会列出可选选项,继续键入命令,同时结合 TAB 即可快速输入命令。

部分 gdb 常用命令一览表

命令 简写形式 说明
list l 查看源码
backtrace bt、where 打印函数栈信息
next n 执行下一行
step s 一次执行一行,遇到函数会进入
finish 运行到函数结束
continue c 继续运行
break b 设置断点
info breakpoints 显示断点信息
delete d 删除断点
print p 打印表达式的值
run r 启动程序
until u 执行到指定行
info i 显示信息
help h 帮助信息

查询用法

在 gdb 命令行界面,使用 (gdb) help command 可以查看命令的用法。

执行 Shell 命令

在 gdb 命令行界面可以执行外部的 Shell 命令:

(gdb) !shell 命令

例如查看当前目录的文件:

GDB 基础知识及断点_第2张图片
此处输入图片的描述

二、GDB 断点

1.重新进入 debugging 调试界面

gdb bugging

2.查看源码

list 命令用来显示源文件中的代码。

通过行号查看源码

list 行号,显示某一行附近的代码:

GDB 基础知识及断点_第3张图片
此处输入图片的描述

list 文件名 : 行号,显示某一个文件某一行附近的代码,用于多个源文件的情况。

通过函数查看源码

list 函数名,显示某个函数附近的代码:

GDB 基础知识及断点_第4张图片
此处输入图片的描述

list 文件名 : 函数名,显示某一个文件某个函数附近的代码,用于多个源文件的情况。

3 设置断点

break 命令用来设置断点。

通过行号设置断点

break 行号,断点设置在该行开始处,注意:该行代码未被执行

GDB 基础知识及断点_第5张图片
此处输入图片的描述

break 文件名 : 行号,适用于有多个源文件的情况。

通过函数设置断点

break 函数名,断点设置在该函数的开始处,断点所在行未被执行

此处输入图片的描述

break 文件名 : 函数名,适用于有多个源文件的情况。

4 查看断点信息

info breakpoints 命令用于显示当前断点信息。

GDB 基础知识及断点_第6张图片
此处输入图片的描述

其中每一项的信息:

  • Num 列代表断点编号,该编号可以作为 delete/enalbe/disable 等控制断点命令的参数
  • Type 列代表断点类型,一般为 breakpoint
  • Disp 列代表断点被命中后,该断点保留(keep)、删除(del)还是关闭(dis)
  • Enb 列代表该断点是 enable(y) 还是 disable(n)
  • Address 列代表该断点处虚拟内存的地址
  • What 列代表该断点在源文件中的信息

5 删除断点

delete 命令用于删除断点。

删除指定断点

delete Num,删除指定断点,断点编号可通过 info breakpoints 获得:

GDB 基础知识及断点_第7张图片
此处输入图片的描述

删除所有断点

delete,不带任何参数,默认删除所有断点。

6 关闭和启用断点

disable 命令用于关闭断点,有些断点可能暂时不需要但又不想删除,便可以 disable 该断点。

enable 命令用于启用断点。

关闭所有断点

disable,不带任何参数,默认关闭所有断点。

关闭指定断点

disable Num,关闭指定断点,断点编号可通过 info breakpoints 获得:

GDB 基础知识及断点_第8张图片
此处输入图片的描述

启用所有断点

enable,不带任何参数,默认启用所有断点。

启用指定断点

enable Num,启用指定断点,断点编号可通过 info breakpoints 获得。

GDB 基础知识及断点_第9张图片
此处输入图片的描述

disable 和 enable 命令影响的是 info breakpoints 的 Enb 列,表示该断点是启用还是关闭

7 断点启用的更多方式

enable 命令还可以用来设置断点被执行的次数,比如当断点设在循环中的时候,某断点可能多次被命中。

断点 hit 一次之后关闭该断点

enable once Num

断点 hit 一次之后删除该断点

enable delete Num

实验中我们可以如下图测试该功能:

GDB 基础知识及断点_第10张图片
此处输入图片的描述

这两个命令影响的是 info breakpoints 的 Disp 列,表示该断点被命中之后的行为

8 断点小结

断点是调试最基本的方法之一,这一节主要介绍了断点相关的知识。主要是几个断点相关的命令。

  • list
  • info breakpoints
  • break
  • delete
  • disableenable
  • enable onceenable delete

不熟悉命令的时候,记得在 gdb 命令行下键入 help info breakpoints 等命令,查询帮助文档。

最后

文章所有内容均截选自实验楼教程【GDB 简明教程】,教程还介绍了以下内容:

  • GDB 单步调试;
  • GDB 函数栈;
  • 对有问题的链表程序的调试来逐步实践挖掘程序 BUG 的过程;

对GDB不太熟悉的小伙伴点击【GDB 简明教程】即可查看~

你可能感兴趣的:(GDB 基础知识及断点)