gdb常用调试命令

转载请注明:https://blog.csdn.net/fuqiangnxn/article/details/94080144

命令

描述

set args arg1 arg2

设置运行参数

show args  

参看运行参数

start

开始执行程序,停在main函数第一行语句前面等待命令

layout src(ctrl+x+a)

加载源码

runr

程序开始执行

breakb)

设置断点

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查看变量类型

 

一、断点命令

  1. b + 行号
  2. b + (文件名:)函数名
  3. info b 查看当前有多少断点
  4. d + 断点编号 删除断点
  5. 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

请看另一篇

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值