目录
一、 什么是GDB
GDB是由GNU软件系统社区提供的调试工具,同GCC配套组成了一套完整的开发环境,GDB是Linux和许多类Unix系统中的标准开发环境。
一般来说,GDB主要完成以下四个方面的功能:
- 启动程序,可以按照自定义的要求随心所欲的运行程序
- 可以让被调试的程序在所指定的设置的断点处停住,断点可以是条件表达式;
- 当程序被停住时,可以检查此时程序中所发生的事;
- 可以改变程序,将一个BUG产生的影响修正从而测试其它BUG
在了解GDB命令之前先了解以下内容。
通常,在为调试而编译时,我们会关掉编译器的优化选项(-o),并打开调试选项(-g)。另外,-Wall在尽量不影响程序行为的情况下打开所有的warning,也可以发现许多问题,避免一些不必要的BUG。
编译时使用: gcc -g -Wall program.c -o program
- -g的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。
如下示例,使用-g参数生成可执行文件test,使用 gdb test 进入GDB调试,输入 l 可以查看源码
如下,如果生成可执行文件test时没有使用-g参数,那么进入gdb调试后,输入 l 会提示【没有符号表被读取】
二、GDB常用命令
2.1 启动、退出、查看代码命令
⚪ 启动/退出
- gdb 可执行程序 启动命令
- quit 退出命令
⚪ 给程序设置参数/获取设置参数
- set args 10 11 给程序设置参数
- show args 显示设置的参数
⚪ GDB使用帮助
- help 显示帮助信息
⚪ 查看当前文件代码
- list/l 从默认位置显示
- list/l 行号 从指定的行显示
- list/l 函数名 从指定的函数显示
⚪ 查看非当前文件代码
- list/l 文件名:行号
- list/l 文件名:函数名
⚪ 设置显示的行数
- show list/listsize 显示显示的行数
- set list/listsize 行数 设置显示的行数
实际测试示例:
2.2 断点操作
⚪ 设置断点
- b/break 行号 在指定的行设置断点
- b/break 函数名 在指定的函数名处设置断点
- b/break 文件名 :行号 在指定文件的指定行设置断点
- b/break 文件名:函数名 在指定文件的指定函数处设置断点
⚪ 查看断点
- i/info b/break 查看断点
示例:
⚪ 删除断点
- d/del/delete 断点编号
⚪ 设置断点无效/生效
- dis/disable 断点编号 设置断点无效
- ena/enable 断点编号 设置断点生效
⚪ 设置条件断点,一般用在循环的位置
- b/break 行号 if i==5
2.3 调试命令
⚪ 运行GDB程序
- start 程序停在第一行
- run 遇到断点才停
⚪ 继续运行,到下一个断点停
- c/continue
示例:
单步执行
- n/next 向下执行一行代码,不进入函数体
- s/step 向下单步调试,遇到函数进入函数体
- finish 跳出函数体
示例:
⚪ 变量操作
- p/print 变量名 打印变量
- ptype 变量名 打印变量类型
⚪ 自动变量操作
- display 变量名 自动打印指定变量的值
- i/info display
- undisplay 编号 不打印
⚪ 其它操作
- set var 变量名=变量值 循环中用到的较多
- until 跳出循环
GDB调试还有很多内容需要学习,以上只是对GDB调试的一个简单介绍。
全文参考:课程列表_牛客网 (nowcoder.com)https://www.nowcoder.com/study/live/504/1/13