以下是:
从优快云的网站上找到的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