在学习gdb调试工具之前,我们要对gcc/g++编译工具进行一些了解
gcc只能编译C语言,g++可以编译C与C++
gcc/g++使用命令
gcc (文件名) -o (要生成的文件名)//此处生成的文件就是可执行文件,并且是release本的
gcc -o (要生成的文件名)(文件名)//这种顺序写法也可以
下面以源文件名字为Gdb.c为例进行演示
生成可执行文件要经预处理,编译,汇编,链接这一过程
- 编译过程为 扫描程序-->语法分析-->语义分析-->源代码优化-->代码生成器-->目标代码优化;
- 扫描程序进行词法分析,从左向右,从上往下扫描源程序字符,识别出各个单词,确定单词类型
- 语法分析是根据语法规则,将输入的语句构建出分析树,或者语法树,分析树parse tree或者语法树syntax tree
- 语义分析是根据上下文分析函数返回值类型是否对应这种语义检测,可以理解语法分析就是描述一个句子主宾谓是否符合规则,而语义用于检测句子的意思是否是正确的
- 目标代码生成指的是,把中间代码变换成为特定机器上的低级语言代码。
gcc -E Gdb.c -o Gdb.i//到预处理完成停止
gcc -S Gdb.c -o Gdb.s//到编译完成停止
gcc -c Gdb.c -o Gdb.o//到汇编完成停止
gdb调试命令
上面说了那么多那么我们要如何对程序进行调试,首先我们要清楚调试只能在debug版本下进行,我们需要把上面的gcc (文件名) -o (要生成的文件名)改为·gcc (文件名) -o (要生成的文件名)-g来生成debug版本的可执行程序
输入命令:gdb 可执行文件名(debug)开始进行调试
退出gdb:输入quit
显示代码:输入list 简写l
gdb自动记录最近一条命令,需要重复使用时直接回车即可
开始调试 输入:r //此时我们没有打断点,输入会直接运行程序
打断点 输入:b 行号
查看断点信息 输入:info b
删除断点 输入:d 断点编号(上图的num)
打了一堆断点,不想删也不想让它起作用,还能够想用的时候使用
输入:disable/enable 断点编号 禁用/启用断点
逐语句调试:s(和VS的F11一样)//可以自己写一个函数验证一下
逐过程调试 输入:n(和VS的F10一样)
如果我们调到一半想重新调试,可以再次输入r
查看某个变量 输入:p 变量名
长显示变量 输入:display 变量名
取消长显示变量 输入:输入:undispaly 编号//不加编号取消全部
当我们打了很多断点,想要逐断点调试 输入:c
运行到固定行停止,输入:until 行号
查看当前调用堆栈,输入:bt
在调试过程中修改某个变量的值,输入:set var 变量名=修改的值