博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gdb调试
阅读量:6251 次
发布时间:2019-06-22

本文共 2986 字,大约阅读时间需要 9 分钟。

hot3.png

gdb 常用命令:

file 
<文件名>
加载被调试的可执行程序文件 gdb file r Run的简写,运行被调试的程序。如果此前没有下过断点,则执行完整个程序; 如果有断点,则程序暂停在第一个可用断点处。 (gdb)rc Continue 的简写,继续执行被调试程序,直到下一个断点或程序结束。 (gdb) c backtrace(或bt) 查看各级函数调用及参数finish 连续运行到当前函数返回为止,然后停下来等待命令frame(或f)帧编号 选择栈帧info(或i)locals 查看当前栈帧局部变量的值list(或l) 列出源代码,接着上次的位置往下列,每次列10行list行号 列出从第几行开始的源代码list函数名 列出某个函数的源代码next(或n) 执行下一行语句print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数quit(或q) 退出gdb调试环境set var 修改变量的值start 开始执行程序,停在main函数第一行语句前面等待命令step(或s) 执行下一行语句,如果函数调用则进入到函数中

在编译时加上-g选项,生成的可执行文件才能用gdb进行源码级调试: -g 选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。gdb提供一个类似shell的命令行环境,上面的(gdb)就是提示符,在这个提示符下输入help可以查看命令的类别

启动gdb开始调试:

  1. gdb program //最常用的用gdb启动程序,开始调试的方式

  2. gdb program core //用gdb查看core dump文件, 跟踪程序core的原因

  3. gdb program pid //用gdb调试已经开始运行的程序,指定pid即可

当单步调试一个函数时,如果不想继续跟踪下去了,可以由两种方式退出:

  1. 第一种用"finish"命令,这样函数会继续执行完,并且打印返回值,然后等待输入接下来的命令。

  2. 第二种用"return"命令,这样函数不会继续执行下面的语句,而是直接返回,也可以用"return expression"命令指定函数的返回值。

使用gdb调试程序时,可以使用"call"或"print"命令直接调用函数执行。

断点:

启动GDB后,首先就是要设置断点,程序中断后才能调试。在gdb中,断点通常有三种形式: 断点(BreakPoint) 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break, 它通常有如下方式:

  • break <function> 在进入指定函数时停住

  • break <linenum> 在指定行号停住

  • break +/-offset 在当前行号的前面或后面的offset行停住。 offiset为自然数。

  • break filename:linenum 在源文件filename的linenum行出停住

  • break ...if <condition> ...可以是上述的参数,condition表示条件,在条件成立时停住。

比如在循环环境体中,可以设置break if i=100, 表示当i为100时停住程序。

可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令:

  • delete 删除所有断点

  • delete breakpoint[n] 删除某个断点

  • disable breakpoint[n] 禁用某个断点

  • enable breakpoint[n] 使能某个断点

观察点(WatchPoint):

在变量读,写或变化时中断,这类方式常用来定位bug.

watch <expr> 变量发生变化时中断

rwatch <expr> 变量被读时中断

awatch <expr> 变量值被读或被写时中断

可以通过info watchpoints [n]命令查看当前观察点信息。

捕捉点(CatchPoint):

捕捉点用来捕捉程序运行时的一些事情。如:载入共享库(动态链接库)、 C++的异常等。通常也是用来定位bug。

捕捉点的命令格式是: catch <event>, event可以是下面的内容

  • throw C++抛出的异常时中断

  • catch C++捕捉到的异常时中断

  • exec 调用系统调用exec时(只在某些操作系统下有用)

  • fork 调用系统调用fork时(只在某些操作系统下有用)

  • vfork 调用系统调用fork时(只在某些操作系统下有用)

  • load或load<libname> 载入共享库(只在某些操作系统下有用)

  • unload或unload<libname> 卸载共享库时(只在某些操作系统下有用)

另外, 还有一个tcatch<event>, 功能类似,不过它只设置一次捕捉点,当程序停住以后,此点被自动删除。

在特定线程中中断

你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

  • break<linespec> thread <threadno>

  • break<linespec> thread <threadno> if ...

linespec 指定了断点设置在的源程序的行号。 threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序的线程信息。如果你不指定thread<threadno>则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。 如:

(gdb) break frik.c:13 thread 28 if baratab > lim

当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。

恢复程序运行和单步调试

在gdb中,和调试步进相关的命令主要有如下几条:

  • continue 继续运行程序直到下一个断点(类似于VS里的F5)

  • next 逐过程序步,不会进入子函数(类似于VS里面的F10)

  • step 逐语句步进,会进入子函数(类似VS里的F11)

  • until 运行至当前语句块结束

  • finish 运行至函数结束并跳出,并打印函数的返回值(类似VS的Shift+F11)

学习资料:

《100个gdb小技巧》

转载于:https://my.oschina.net/lvhuizhenblog/blog/798748

你可能感兴趣的文章
转子接地保护原理_发变组保护动作逻辑
查看>>
hive中groupby优化_面试必备技能-HiveSQL优化
查看>>
uni 页面加载完毕_HTML页面生命周期
查看>>
c语言机票座位预定系统_趁东京奥运!日航要免费送5万张国内机票!给非日本居民...
查看>>
创业冲突的五种解决方法是_冲突管理的五种策略
查看>>
lsmw中文显示乱码_中文注释不能在keil 4/5中正常显示——都是方框或乱码?
查看>>
hcg值小于0.1_【原理】JavaScript 中 0.1 + 0.2 为什么不等于 0.3?
查看>>
springboot的jsp应该放在哪_健身小白用2个月亲身经历告诉你小白去健身房,应该做到哪几点...
查看>>
opencv表面缺陷检测_工业产品表面缺陷检测方法
查看>>
kettle使用数据库来生成序列_时间序列数据库Influxdb的使用
查看>>
配置babel_关于 Babel 你必须知道的
查看>>
数据丢失与重复_消息队列重复消费和数据丢失问题(石衫面试突击学习笔记)...
查看>>
摄像头 火狐_为什么谷歌浏览器打不开电脑摄像头?
查看>>
两张图片合成一张_ps技巧:大光比照片后期曝光合成技法
查看>>
码条形码属性_条码生成器如何批量生成code 11码
查看>>
和lua的效率对比测试_不同编程语言能耗不同?看这27种语言对比!
查看>>
让某控件失去焦点_常用基本控件测试用例(一)
查看>>
天气模式_今年台风活跃期即将结束!下周天气将开启“大变脸”模式
查看>>
扫码枪关闭常亮模式_生意好时最怕收银出故障,这几个扫码枪的常见问题你一定要知道...
查看>>
如何双击打开vivado工程_利用TCL重建vivado工程
查看>>