2 void b();
3
4 main()
5 {
6 int i=10;
7 b();
8 }
9
10 void b()
(gdb) l
11 {
12 int i;
13 i=100;
14 }
l n,m
列出从n到m.
l function
列入出函数function的源码.
r 运行程序,r 后可直接接参数, 参数被传给程序.
p 命令可以看个变量的内容.如:(gdb)p i
断点的设置和管理:
b 设置断点.
b 行号
b 函数名
每一个断点用一个序列号来描述.
c 继续运行
如:
(gdb) b b
Breakpoint 1 at 0x804845a: file g.c, line 13.
---
序列号为1
(gdb) r
Starting program: /root/tmp/a.out
Breakpoint 1, b () at g.c:13
13 i=100;
(gdb) c
Continuing.
Program exited with code 0240.
info breakpoint 可以察看现在的断点情况.
delete 序列号 用来删除断点
clear 行号 也是用来删除断点的
enable 序列号 允许一个断点
disable 序列号 禁止一个断点
tb 创建一个临时断点,中断一次后即被禁止.
其实,在设断点时还可以加条件,例如:
b 100 if ( i == 10 )
但运行到100行且i等于10则中断.
如果希望在i等于100时被中断,而不管运行到哪里,可用下面的
命令: watch i == 100. 如果希望无论何时只要存取i时,就会被中断
awatch i.
命令bt产生议长列表,包含了从最近的过程开始的所有的有效过程
和调用这些进程的参数.
用set variable i=100 可以改变变量i的值.
用where可以知道当前的位置.
用whatis和ptype可以显示变量的类型.你试一试就知道了.
单步执行:
step
next
区别在于,step可以调试进一个函数的内部.
看看下面一个程序:
a.c
a()
{
int i=0;
b()
}
b()
{
int i;
i=100;
......
当你调试进函数b时,你用p i会看到b 中的 i.实际上,这些局部变
量是存栈中的,在gdb中可用up和down来在堆栈中移动.在上面这个
例子中,
(gdb)p i
i = 100 //b中的i
(gdb)up //切换到函数a的堆栈中
(gdb)p i //a中的i
i = 0
(gdb)down //返回b
你可以直接使用命令call来调用一个函数,当你在一个函数中时,
你可以用finish来结束本次调用(后面的代码被运行),也可以用
(return 返回值)来强制返回(后面的代码不被运行).
在gdb中处理信号:
handle 信号名 option
option
nostop 不发送给程序,也不停止程序.
stop 停止程序运行,以便调试
print 打印一条消息
noprint 不显示消息
pass 将信号传递给程序
nopass 不把信号传递给程序
你可以使用(signal 信号名)来主动发送一个信号.
发布人:netbull 来自:Bricks with GNU&LINU