GDB Commands

发布时间: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(或pNUM[=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

从某个位置开始打印存储器的一段内容,全部当成字节来看,而不区分哪些字节属于哪些变量. 形式为:
x/FMT    ADDRESS; FMT
o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char) , s(string), b(byte), h(halfword), w(word), g(giant, 8 bytes)

程序的运行,你有可能需要设置下面四方面的事。

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>
相当于shellcd命令。
    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来取消挂接的进程。