五、GCC & GDB
5.1 gcc
阶段 | 变化 | 命令 |
---|---|---|
预处理 | hello.c->hello.i | gcc -E |
编译 | hello.i->hello.s | gcc -S |
汇编 | hello.s->hello.o | gcc -c |
链接 | hello.o->a.out | gcc |
bash
gcc -E hello.c -o 1.i # -o指定输出文件
gcc -E hello.c -g # -g包含提示信息
gcc -D
gcc -DDebug <FILE>
gcc -DSize 12 <FILE>
5.2 gdb
5.3.1 生成调试信息
没有-g,将看不到程序的函数名、变量名,所替代的是运行时的内存地址
bash
gcc -g 1.c -o 1
g++ -g 1.cpp -o 1
5.3.2 启动dgb
bash
gdb <执行文件> # 启动gdb
5.3.3 设置运行参数
bash
set args <arg1> <arg2> ... <argn> # 指定运行时的参数, argv[]
show args # 查看设置好的运行参数
5.3.4 显示源代码
bash
list # 默认打印10行(一般是打印当前行的前五行和后五行)
list <LINENUM> # 指定打印的行数
list <FUNCTION_NAME> # 显示函数名为FUNCTION_NAME的源程序
list - # 显示当前行前面的代码
set listsize <COUNT> # 设置一次显示源代码的行数
show listsize # 查看当前的listsize
5.3.5 断点
5.3.5.1 简单断点break
(可用b
代替)
bash
break 10 # 设置断点在第10行
b 10
break main # 设置断点在main函数
b main
5.3.5.2 多文件设置断点
bash
break filename:linenum # 在filename中的linenum行打断点
break filename:function # 在filename中的function处打断点
break class::function # 在class中的function处打断点
break namespace::class::function # 在名称空间为namespace中的class类中的function处打断点
5.3.5.3 查询断电info
(可用i
代替)
bash
info b
info break
i break
i b
5.3.5.4 条件断点
bash
b <filename>:<linenum> if <param> == 5
b 1.c:8 if a == 5
5.3.5.5 维护断点(删除断点delete
(d
), 使断点无效disable
(dis
), 是断点生效enable
(ena
))
-
删除断点
bashdelete [range..] delete 断点号1 # 删除断点号为1的断点 delete 断点号1 - 断点号4 # 删除断点号1-4的断点
-
使断点无效
bashdisable # 没有指定,全部断点失效 disable [range] # 和删除断电一个用法
-
使断点生效
bashenable # 没有指定,全部断点生效 enable [range]
5.3.6 调试代码
指令 | 含义 | 简写 |
---|---|---|
run | 运行程序 | r |
next | 单步跟踪,不会进入函数体内 | n |
step | 单步跟踪,会进入函数体内 | s |
finish | 退出进入的函数 | |
until | 在一个循环体内单步跟踪时,可以运行程序知道退出循环体 | u |
conintue | 继续运行程序到下一个断点处 | c |
quit | 退出gdb | q |
5.3.7 数据查看(print
(p
))和自动显示(display
)
- 数据查看
bash
print 变量/表达式/字符串
- 自动显示(
display
)
在程序运行过程中,每次停住的时候,这些变量都会自动显示
bash
display 变量名
info display # 查看display设置的自动显示的信息
undisplay num # num(info display显示的编号),取消自动显示
disable display num # 使得..失效
enable display num # 恢复
- 查看变量的值的类型
bash
ptype 变量
- 设置变量的值
bash
set var 变量=100 # 将变量的var值设置为100