发布时间:2011-4-10 19:49
分类名称:Linux
在编译源文件时要加上-g选项,生成的目标文件才能用gdb进行调试,
$ gcc -g main.c -o main
$ gdb main
-g选项的作用是在目标文件中加入源代码的信息,比如目标文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到目标文件中,所以在调试时目标文件时必须保证gdb也能找到源文件。
可以把源代码改名或移到别处,再用gdb调试目标文件,就列不出源代码了:
$ mv main.c mian.c
$ gdb main
......
(gdb) l
5 main.c: No such file or directory.
in main.c
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 | 从某个位置开始打印存储器的一段内容,全部当成字节来看,而不区分哪些字节属于哪些变量. 形式为: |
程序的运行,你有可能需要设置下面四方面的事。
1、程序运行参数。
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。
2、运行环境。
path <dir> 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。
3、工作目录。
cd <dir> 相当于shell的cd命令。
pwd 显示当前的所在目录。
4、程序的输入输出。
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。如:run > outfile
tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb
调试已运行的程序
两种方法:
1、在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb <program> PID格式挂接正在运行的程序。
2、先用gdb <program>关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。