用GDB调试程序--调试器GDB常用功能(进阶级)

以下是:


从优快云的网站上找到的GDB使用说明。

原文标题:用GDB调试程序

作者:haoel (QQ是:753640,MSN是: haoel@hotmail.com

关键字:gdb 调试 c c++ gun


这篇文章非常好,所以摘录并进行改进以收藏。

源代码如下所示:

(gdb) list
1 /* it will result in SIGSEGV */
2 int sub(int a,int b,int c){
3
4 *(int *)a=16;
5 return 0;
6 }
7
8 int main()
9 {
10 int a=0;
(gdb)
11 int b=1;
12 int c=2;
13 sub(a,b,c);
14 return 0;
15 }
16

(gdb) disassemble main
Dump of assembler code for function main:
0x000000000040050b <main+0>: push %rbp
0x000000000040050c <main+1>: mov %rsp,%rbp
0x000000000040050f <main+4>: sub $0x10,%rsp
0x0000000000400513 <main+8>: movl $0x0,-0xc(%rbp)
0x000000000040051a <main+15>: movl $0x1,-0x8(%rbp)
0x0000000000400521 <main+22>: movl $0x2,-0x4(%rbp)
0x0000000000400528 <main+29>: mov -0x4(%rbp),%edx
0x000000000040052b <main+32>: mov -0x8(%rbp),%esi
0x000000000040052e <main+35>: mov -0xc(%rbp),%edi
0x0000000000400531 <main+38>: callq 0x4004ec <sub>
0x0000000000400536 <main+43>: mov $0x0,%eax
0x000000000040053b <main+48>: leaveq
0x000000000040053c <main+49>: retq

可以使用help break/watch/catch获取帮助信息。

一,断点的设置

意义: 例子:

进入函数时停止 break main

指定行号停止 break 8

当前行的offset处停止 break +2

break -2

某个源文件的某行处停止 break test.c:8

某个源文件的某个函数处停止 break test.c:main

内存地址处停止 break *(0x000000000040050b)

下一行停止 break

某一个条件下停止 break 12 if a==0

break 12 if b!=0

查看断点的统计信息,包括hit上的数目等 info break

info break 2

二,观察点的设置

意义: 例子:

表达式/变量的变化则停止 watch a

watch a+b

当表达式/变量被读时停止 rwatch a

rwatch a+b

当表达式/变量的值被读或者写时停止 awatch a

awatch a+b

查看观察点 info watchpoints

三,捕捉点的设置

意义: 例子:

捕捉一个C++抛出的异常 catch throw

捕捉一个C++捕捉到的异常 catch catch

仅设定一次捕捉,之后自动删除 tcatch catch/throw

四,捕捉点的维护

意义: 例子:

清除所有停止点 clear

清除某个函数上的停止点 clear main

clear test.c:main

清除指定行号上的停止点 clear 10

clear test.c:10

清除指定断点 delete (所有断点)

delete 2(断点号)

delete 2-7(断点号2-7)

关闭指定断点 disable(所有断点)

disable2(断点号)

disable 2-7(断点号2-7)

开启指定断点 enable(所有断点)

enable 2(断点号)

enable 2-7(断点号2-7)

开启指定断点1次 enable once 2(断点号)

enable once 2-7

开启指定断点1次 ,之后删除 enable delete 2(断点号)

enable delete 2-7

五,停止条件维护

意义: 举例:

修改某个断点的条件 condition 1 a!=1

清除某个断点的条件 condition 1

忽略停止条件指定次数 ignore 1 2(忽略2次)

六,为停止点设定运行命令

这有利于自动化调试

意义: 举例:

指定停止点执行数个命令 break foo if x>0

commands

printf "x is %d\n",x

continue

end

设置停止点后,紧跟着设定commands

commands 1(停止点号)

printf "x is %d\n",x

continue

end

给指定停止点号,设置commands。

清除 commands 1(停止点号)

end

清除指定停止点的commands

七,函数重载的影响

如果函数名字相同,可以使用告知参数类型的方式,和gdb提示,自己再选择的方式指定。

八,信号

 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是






























































Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状































































态改变信号; SIGKILL表示终止程序运行的信号,等等。信号量编程































































是UNIX下非常重要的一种技术。










































































































































































意义: 例子:

































































































查看gdb如何处理某个信号 handle SIGIO SIGKILL

























































handle SIGKILL
指定gdb如何处理某个信号 handle SIGIO SIGKILL stop(关键字)
handle SIGKILL print(关键字)

关键字: nostop

当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号。

stop
当被调试的程序收到信号时,GDB会停住你的程序。
print

当被调试的程序收到信号时,GDB会显示出一条信息。

noprint

当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。
pass

noignore
当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。
nopass
ignore
当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。

查看有哪些信号在被GDB info signals
检测中及其处理 info handle
九,搜索源代码
意义: 举例:

向前搜索 forward-search mai*(正则表达式)

search mai*(正则表达式)
全面搜索 reverse-search mai*(正则表达式)
十,指定源文件路径

意义: 举例:
指定源文件路径 dir /root/mylinuxc
指定多个源文件路径 dir /root/mylinuxc :/root/mylinuxc/src
清除自动以路径 directory
查看定义的源文件搜索路径 show directories
十一,查看数组
意义: 例子:

查看数组地址和数组的项大小的数组 int *array = (int *) malloc (len * sizeof (int));

print *array@len
如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。





十二,自动显示


意义: 例子:

自动显示对应指令的汇编代码 display/i $pc
查看自动显示 info display
删除指定显示号的自动显示 undisplay 1(自动显示号)
delete display 1 2
delete display 1-2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值