1.使用-g参数生成的目标才能用gdb命令
> gcc -g test.c -o test
2.基本命令
list(l) |
|
list LINENUM | 列出当前文件中LINENUM周围的行(上下5行) |
list FILE:LINENUM | 列出在FILE文件中的LINENUM的周围的的行 |
list FUNCTION | 列出当前文件FUNCTION函数的开始部分 |
list FILE:FUNCTION | 列出再FILE文件中的FUNCTION函数的开始部分 |
start | 开始调试程序, 运行到程序中的main函数的开始为止 |
run(or r) | 执行下一条(或执行N条语句), 相当于VC中的F10. (不进入函数内部执行), 缩写命令为: n |
next(or n) N | 执行下一条(或执行N条语句), 相当于VC中的F10. (不进入函数内部执行), 缩写命令为: n |
step(or s) N | 执行下一条(或执行N条语句), 相当于VC中的F11. (进入函数内部执行), 缩写命令为: s |
backtrace(or b) [-]N | 打印所有的调用栈(或者最内层的N层, 或者最外层的-N层,加个负号即可), 缩写命令为: bt |
frame(or f) N | 选择和打印相应堆栈, N可以是栈的序号, 也可是栈的地址. 参考info frame. |
info locals | 查看当前栈帧局部变量的值. 或者简写为 I locals. |
finish | 执行到当前函数返回,然后停下来等待命令 |
print(或p)NUM[=num] | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
set [var] Variable=NUM | 修改变量的值 |
break(or b) 行号 | 在某一行设置断点 |
break 函数名 | 在某个函数开头设置断点 |
break...if... | 设置条件断点 |
continue(or c) | 从当前位置开始连续而非单步执行程序 |
delete breakpoints | 删除断点 |
display 变量名 | 跟踪查看一个变量,每次停下来都显示它的值 |
disable breakpoints | 禁用断点 |
enable breakpoints | 启用断点 |
info(or i) breakpoints | 查看当前设置了哪些断点 |
run(or r) | 从头开始连续而非单步执行程序 |
undisplay | 取消对先前设置的那些变量的跟踪 |
watch | 设置观察点 |
I watchpoints | 查看当前设置了哪些观察点 |
x | 从某个位置开始打印存储器的一段内容,全部当成字节来看,而不区分哪些字节属于哪些变量. 形式为: |
2.设置环境
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。
path <dir> 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。
cd <dir> 相当于shell的cd命令。
pwd 显示当前的所在目录。
程序的输入输出。 使用重定向控制程序输出。如:run > outfile。start < infile
3.断点相关命令
命 令 | 参 数 含 义 | 说 明 |
break | 断点位置 | 设置程序断点 |
tbreak | 断点位置 | 设置临时断点,触发一次后自动删除 |
hbreak | 断点位置 | 设置硬件断点,必须要有硬件的支持 |
thbreak | 断点位置 | 设置临时硬件断点 |
rbreak | 正则表达式 | 在与正则表达式匹配的函数入口上设置断点 |
info breakpoints |
| 查看断点设置情况 |
watch | 监视点表达式 | 设置写监视点 |
rwatch | 监视点表达式 | 设置读监视点 |
awatch | 监视点表达式 | 设置访问监视点 |
info watchpoints |
| 查看监视点设置情况,等价于info breakpoints 命令 |
set can-use-hw-watchpoints | 布尔值 | 设置是否能够使用硬件断点 |
show can-use-hw-watchppints |
| 显示能否使用硬件断点,0不可以,1可以 |
catch event | 要捕捉的事件:比如throw catch exec fork 等 | 捕捉程序运行时发生的事件,目前不支持 |
clear | 函数名 行号或者地址 | 删除断点 |
delete [breakpoints][range…] | 断点号或者断点号范围 | 删除断点 |
disable[breakpoints][range…] | 断点号或者断点号范围 | 禁用断点 |
enable [breakpoints][range…] | 断点号或者断点号范围 | 使能断点 |
enalbe[breakpoints]once range…. | 断点号或者断点号范围 | 使能断点一次 |
enable [breakpoints] delete range …. | 断点号或者断点号范围 | 使能断点一次,触发断点一次后,将其删除 |
break ….if cond | 断点号或者断点号范围 | 仅当条件为真时,断点有效 |
condition bnum expression | 断点号 | 仅当条件为真时,断点有效 |
ignore bnum count | 程序执行经过断点的次数 | bnum 断点号 忽略count次经过断点 |
commands [bnum] ……command-list…. end | 断点号 | 设置断点命令列表 |
4.调试已运行的程序
两种方法:
4.1在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb <program> PID格式挂接正在运行的程序。
4.2先用gdb <program>关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。