-c |
只编译和汇编不连接 |
编译成目标代码.o文件 |
-s |
只编译,不汇编和链接 |
编译成汇编文件以.s为扩展名 |
-v |
显示gcc版本 |
|
-g |
添加调试标识 |
|
-ggdb(n) |
是用gdb扩展产生调试符号 |
n值为1至3,表示级别,其中3为最高级 |
-Wall |
显示所有的警告 |
|
O(n) |
对编译的代码进行优化 |
n为优化基别,值为1至3,3为最高级别 |
gdb常用选项
Ø step(s)和 next(n)单步调试命令
说明:step进入函数内部,next不进入函数内部
Ø print 和display 显示命令
print 表达式特点:
1) print $编号 打印从1开始的第“编号”个print命令
2) print $$编号 打印cong当前编号倒着数的编号+1个print命令,即:
(当前编号-编号+1)的print命令
3) 对变量进行赋值 print 变量=表达式
4) 打印内存某个部分开始的一块连续空间的内容 print 开始表达式(地址)@要打印的连续空间的大小
5) 按格式显示变量 print或 display /格式控制符 变量
display和print的区别:
在使用display命令时,每次调试器中断程序、挂起指令时都要显示变量的值。可以使用undisplay <dnums …> dnums为设置好的自动显示的编号 可用-表示一个范围,或用分割自动编号,来一次删除多个
注意:
显示命令中,如果局部变量和全局变量重名,那么显示的是局部变量,如果要显示全局变量,则应该使用:file::variable
输出格式:
x 十六进制格式显示变量; d十进制格式显示变量;
u十进制无符号格式显示变量; o八进制格式显示变量;
t二进制格式显示变量; c字符格式显示变量;
f浮点格式显示变量
Ø set命令
set 用来改变变量的值 set 变量=值
Ø break 设置断点命令以及相关命令
continue命令
continue 使程序在信号发生后或是停在断点之后继续运行,可以带一个参数n,表示程序在运行过程中将忽略断点的次数为n,也就是在第n+1次运行到断点时,才暂停程序的执行
condition命令
condition 当条件表达式为真时,“断点编号” 处会暂停程序的执行;
condition 断点编号 条件
tbreak 设置临时断点命令
说明:当该断点只要一执行,该断点将会自动删除;
disable 断点编号
说明:使所设置的断点失效
enable 断点编号
说明:恢复暂时失效的断点
delete 断点编号或者表达式
说明:清除指定断点
clear 要清除断点所在的行号
说明:清除指定断点,使用该方式,gdb会给出提示,而delete不会给出提示
Ø watch 设置观察窗口
可以设置任何需要查看的表达式,但是要注意到是由于观察窗口不是一段特定的代码,因此可以在程序运行的任何时间对其求值,可是如果在表达中的某个变量取值超出返回,将不能再对表达式取值了
Ø 查看栈信息相关命令
backtrace 或 bt 查看栈信息,但要注意输出和调用正好相反;
backtrace n(-n) 或 bt 查看栈顶上n层(栈底下n层)信息;
切换当前栈: frame n 或f n 其中n为从0开始的整数,是栈中的层编号,0表示栈顶。
up n 和down n:up表示向栈底方向移动n层,down表示向栈顶方向移动n层
查看当前栈: frame或f
显示详细当前栈信息:info frame或info f
显示当前函数的参数名及值: info args
显示当前函数所有局部变量的名及值:info locals
显示当前函数中的异常处理信息:info catch
Ø 显示源代码list命令
参数:<linenum>或<function> 或<first>,<last>或, <last>或<+offset>或<-offset>
<filename:function>
<*address>:程序运行时的语句在内存中的地址
Ø info line命令
说明:查看源代码在内存中的地址,后面可跟:行号,函数名,文件名:行号,文件名:函数
Ø 产生信号量: signal <signal(1-15)>
Ø 强制函数返回: return <expression>
说明:如果指定了expression,则该表达式的值将作为返回值返回。
Ø 强制调用函数:call <expr>
说明:expr代表函数名,将显示返回值,如果返回值为void,则不显示;
Ø 分析core文件
步骤:
1. 使用 gdb –ggdb3 文件名.c –o 文件名
2. 使用ulimit –c unlimited 获得权限
3. 使用gdb文件名 core.****