gdb的用法及常用指令

一.gdb调试器

程序开发过程中免不了会有一些错误出现,那么就需要对程序进行调试了,在windows中vs直接集成了各种调试工具。在linux中我们需要安装一个额外的调试器,gdb调试器(GNU debugger)是linux下一个c/c++的强大的调试器。其主要功能:

  • 设置断点
  • 单步执行
  • 查看变量
  • 动态改变环境

输入gdb -v可以查看系统中gdb版本,没有则说明未安装gdb。若是系统没有安装gdb调试器,可以输入:sudo yum install gdb 直接在线安装(离线方法较麻烦,不推荐)。

gdb filename 就可以直接进入gdb调试器,注意这里的filename文件在编译是需要-g这样文件才包含有调试信息,-g后面可以接数字1,2,3表示级别,级别越高信息越多ex:-g1 ,-g2。-ggdb是gdb专用的,与-g相同。

二.gdb常用命令:

filename :装入要调试的可执行文件

run :执行当前调试程序

kill :终止当前调试程序

step :执行一行代码进入函数内部

next :执行一行代码不进入函数内部

break :设置断点

display :设置自动显示的表达式或变量

list :列出产生执行文件的源代码的一部分

watch :监视变量的值

return :强制函数返回

gdb对程序进行调试的基本过程:gdb filename,进入调试;因为进入调试后直接run的话程序会直接运行退出,这样就无法进行调试了,因此在run之前,需要先设置断点break(同时也可以添加需要显示或监视的变量);这样程序运行到断点处就自动停下来了,这时就可以进行基本的调试,next和step都是向下执行一行代码,区别在于遇到函数的话step会跳转到函数内部执行一行,而next不会;这时可以用print打印出变量的值,之前也可以display设置变量显示,即在调试过程中变量有变化时会自动显示它的值;

三.断点的设置与删除

break linenumber :在特定行设置断点

break fun :在函数处设置断点

break :没有参数,在下一行设置

break if condition :在特定条件下有断点(停止运行)

clear linenumber :清除所在行号的断点

clear fun :清除函数所在的断点

clear :清除所有断点

delete b_id :清除指定断点编号的断点

enable/disable b_id :使指定断点编号的断点有效/失效

info breakpoints :查看当前设置断点信息(编号,是否有效,位置)

display:自动显示变量

display 表达式 :添加自动显示的表达式或变量

info display :查看当前设置信息

delete display number :删除指定编号的display信息

undisplay number :同上

disable/enable display number :使指定编号的display暂时无效/有效

list显示源代码

list :输出当前行前后的源代码

list n: 输出第n行前后的10行代码

list fun :输出函数fun前后的10行代码

list n,m:显示n到m行的代码

list,m:显示当前到m行的代码

show listsize:显示list设置,即默认显示几行,一般为10

set listsize count :设置默认显示行数

其他常用调试命令

whatis 变量或表达式 :显示某个变量或表达式的数据类型

jump 行号:让程序跳到指定行开始调试

continue:遇到断点停止后,继续运行

show language:查看当前语言环境.

info source: 查看当前文件语言

until :在执行完循环体内的最后一条语句之后执行 until, 就会执行完循环体

until m:继续运行到m行

finish:执行完当前的函数

set args 参数:指定运行时的参数

show args:查看设置好的参数

线程调试命令

info threads:查看当前进程的线程

thread id:切换调试的线程为指定ID的线程

break file.c:100 thread all:在file.c文件第100行处为所有经过这里的线程设置断点

set scheduler-locking off|on|step:在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,off:不锁定任何线程,也就是所有线程都执行,这是默认值。on:只有当前被调试程序会执行。step:在单步的时候,除了next过一个函数的情况以外,只有当前线程会执行

hread apply ID1 ID2 command:让一个或者多个线程执行GDB命令command

thread apply all command:让所有被调试线程执行GDB命令command

set follow-fork-mode child:fork之后调试子进程,父进程不受影响

set follow-fork-mode parent:fork之后继续调试父进程,子进程不受影响

attach pid:附着(attach)到正在运行的进程,pid为进程号命令简称

在gdb中许多命令都有简写:例如run可以用r代替,下面简要说明:

run :r

next:n

step :s

break :b

delete:d

list:l

print:p

continue:c

info:i

quit:q

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值