转载请注明:https://blog.csdn.net/fuqiangnxn/article/details/94080144
命令 | 描述 |
set args arg1 arg2 | 设置运行参数 |
show args | 参看运行参数 |
start | 开始执行程序,停在main函数第一行语句前面等待命令 |
layout src(ctrl+x+a) | 加载源码 |
run(r) | 程序开始执行 |
break(b) | 设置断点 |
continue(c) | 执行到下一个断点或程序结束 |
next(n) | 非进入式(不会进入到所调用的子函数中)单步执行 |
step(s) | 进入式(会进入到所调用的子函数中)单步执行,进入函数的前提是,此函数被编译有debug信息 |
print(p) | 打印表达式的值 |
until + 行数 | 跳到程序某一行 |
finish | 一直运行到函数返回并打印函数返回时的堆栈地址和返回值及参数值等信息 |
backtrace(bt) | 查看各级函数调用及参数(堆栈列表) |
frame(f) 帧编号 | 选择栈帧 |
up | 跳到上层函数 |
down | 跳到下层函数 |
refresh | 刷新因为打印或者c导致的显示乱序 |
catch | 设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常 |
quit(或q) | 退出gdb调试环境 |
whatis | 查看变量类型 |
一、断点命令
- b + 行号
- b + (文件名:)函数名
- info b 查看当前有多少断点
- d + 断点编号 删除断点
- disable/enable + 断点编号 不启用/启用断点
二、内存断点
awatch 读写断点
rwatch 读断点
watch 写断点
意味着在使用上面函数进行设置断点时,内存如果变量buf被读/写时就会自动断点。
例子:
1.首先获取变量地址
p &buf(或者display &buf)
$1 = (char (*)) 0x28c808
2.开始断点
watch *(int*) 0x28c808
此时当buf变量被修改时,则断点停住
三、信号命令
signal signal SIGXXX 产生XXX信号,如SIGINT。一种速查Linux查询信号的方法:# kill -l
handle 在GDB中定义一个信号处理。信号可以以SIG开头或不以SIG开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO信号到SIGKILL的信号,其中包括SIGIO,SIGIOT,SIGKILL三个信号),也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号,运行程序马上会被GDB停住,以供调试。其可以是以下几种关键字的一个或多个:
nostop/stop
当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号/GDB会停住你的程序
print/noprint
当被调试的程序收到信号时,GDB会显示出一条信息/GDB不会告诉你收到信号的信息
pass/noignore
当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。
nopass/ignore
当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。
info signals
info handle
可以查看哪些信号被GDB处理,并且可以看到缺省的处理方式
single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获的,而single命令所发出一信号则是直接发给被调试程序的。
四、调试多线程调试
info threads 查看当前进程的线程,GDB会为每个线程分配一个ID, 前面有*的是当前调试的线程.
thread <ID> 切换调试的线程为指定ID的线程。
break file.c:100 thread all 在file.c文件第100行处为所有经过这里的线程设置断点。
set scheduler-locking off|on|step
在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,
怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
on 只有当前被调试程序会执行。
step 在单步的时候,除了next过一个函数的情况
(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command
thread apply all command 让所有被调试线程执行GDB命令command。
五、多进程调试
1.默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。
parent on 只调试主进程(GDB默认)
child on 只调试子进程
parent off 同时调试两个进程,gdb跟主进程,子进程block在fork位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置
2.设置follow-fork-mode 和 detach-on-fork
设置follow-fork-mode 和 detach-on-fork:
set follow-fork-mode [parent|child] set detach-on-fork [on|off]
切换进程
info inferiors查询进程号
inferior <infer number>切换进程
例子:
set follow-fork-mode child
catch exec(调用exec时断点被踩到)
六、调试带宏程序
在GDB下, 我们无法print宏定义,因为宏是预编译的。
在GCC编译程序的时候,加上-ggdb3参数,就可以了。
info macro 查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
macro 查看宏展开的样子
七、gdbserver
请看另一篇