[转]GDB
gcc -g main.c //在目标文件加入源代码的信息
gdb a.out (gdb) start //开始调试
(gdb) n //一条一条执行
(gdb) step/s //执行下一条,如果函数进入函数
(gdb) backtrace/bt //查看函数调用栈帧
(gdb) info/i locals //查看当前栈帧局部变量
(gdb) frame/f //选择栈帧,再查看局部变量
(gdb) print/p //打印变量的值
(gdb) finish //运行到当前函数返回
(gdb) set var sum= //修改变量值
(gdb) list/l 行号或函数名 //列出源码
(gdb) display/undisplay sum //每次停下显示变量的值/取消跟踪
(gdb) break/b 行号或函数名 //设置断点
(gdb) continue/c //连续运行
(gdb) info/i breakpoints //查看已经设置的断点
(gdb) delete breakpoints //删除某个断点
(gdb) disable/enable breakpoints //禁用/启用某个断点
(gdb) break if sum != //满足条件才激活断点
(gdb) run/r //重新从程序开头连续执行
(gdb) watch input[] //设置观察点
(gdb) info/i watchpoints //查看设置的观察点
(gdb) x/7b input //打印存储器内容,b--每个字节一组,7--7组
(gdb) disassemble //反汇编当前函数或指定函数
(gdb) si // 一条指令一条指令调试 而 s 是一行一行代码
(gdb) info registers // 显示所有寄存器的当前值
(gdb) x/ $esp //查看内存中开始的20个数
一、启动程序
如果在启动gdb时没有指明程序,可以使用命令file或exec-file加载程序;
run(r):
run(r)命令使程序启动,可以在run命令中指明程序参数;值得注意的是,首次运行run后,如果再次执行run并且不带参数,会以之前的参数运行程序。
set args:
指定程序的参数。set args后,run可以不带参数而以指定的参数运行程序。如果set args不太参数,清楚程序参数,执行run后程序不太参数运行。
在加载程序后,如果程序重新编译,gdb会根据符号文件的更改时间自动重载加载符号文件,所以,不需要重新加载文件。
start:
使用start命令使程序停在main函数的第一条语句。
二、调试已经在运行的程序
attach pid:
从ps获得进程号,通过attach命令连接到该进程。attach一个进程后,gdb首先stop该进程,这样就可以设置断点,执行step、continue等命令;如果执行r命令,会杀掉原来的进程。
detach:
释放该进程,原进程会继续执行。
三、调试多个inferiors和程序
gdb允许在一个会话下调试多个程序,比如一个进程fork出两个或者多个进程,或者把当前程序复制出一个副本,这些都是通过inferior实现控制。
info inferiors:
显示当前管理的inferiors。
inferior infono:
切换到对应的inferior。
add-inferior [-copies n] [-exec executable]:
添加n(默认为1)个inferior,如果指明executable文件,可以以后通过file加载符号文件。
clone-inferiror [-copies n] [infno]:
复制编号为infno(默认为当前)的inferior。
其它相关命令:
remove-inferiors infno
detach inferior infno
kill inferiors infno
maint info program-spaces
四、调试fork
默认情况下,当一个程序fork,gdb会跟踪父进程而子进程畅通无止的执行。如果在child中设置了一个断点,执行到断点处,child会收到一个SIGTRAP信号,默认为终止程序。
最开始调试child进程的方法是在child中设置一个sleep,然后通过attach连到child。
set follow-fork-mode mode
show follow-fork-mode:
在Linux2.5.46以后,gdb支持fork函数的调试;通过set-follow-mode命令,设置跟随parent还是child,如果不设置默认为跟随parent。
set detach-on-fork mode
show detach-on-fork:
在Linux,可以通过set detach-on fork off命令,在fork后,对parent和child都进行调试。父、子进程为多个inferiors,参见第三部分。
五、多线程调试
info threads:
显示线程信息。
thread thread-id:
切换到对应线程。
thread name [name]:
修改当前thread的名称。默认为程序名称。
六、Checkpoint
在Linux,gdb支持保留程序在某个时候的快照,除了进程号和已经输出的内容,所有状态恢复到快照状态。
通过以下命令实现快照。
checkpoing: 生成当前状态的快照
info checkpoint:显示快照信息
restart checkpoint-id:恢复到某个checkpoint
delete checkpoint checkpoint-id:删除某个checkpoint
[转]GDB的更多相关文章
- linux应用调试技术之GDB和GDBServer
1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...
- 新手如何在gdb中存活
网络上已经有很多gdb调试的文章了,为什么我还要写这篇文章呢,因为本文是写给gdb新手的,目的就是通过一个简单的例子来让新手很快上手.一旦上手入门了,其他的问题就可以自己去搜索搞定了.右边是gdb的L ...
- GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断
多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程 ...
- GDB调试命令
1.查看源码: list [函数名][行数] 2.暂停程序 (1)设置断点: a.break + [源代码行号][源代码函数名][内存地址] b.break ... if condition .. ...
- 关于gdb和shp的FID问题
gdb的FID从1开始,并且FID唯一,从数字化时开始,每个图形对应唯一的FID,删除图形亦删除对应的FID.FID可能出现中断的情况. shp的FID从0开始,并且永远连续.删除图形,则编号在其下面 ...
- GDB调试命令小结
1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...
- gdb 基本知识
一 单步执行和跟踪函数调用 先给出一段代码,可以用下面介绍的例子. #include <stdio.h> int add_range(int low, int high) { int i, ...
- GDB 完全教程
一.简介 GDB是一个功能强大的调试器,它是一个自由软件,能够用在许多UNIX平台上.它同时也是Linux系统中的默认调试器.GDB已被移植到许多其他的计算机平台上,并且能够用于调试嵌入式实时系统.一 ...
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...
- gdb可以调试python的pdb么
1.如题: gdb可以调试python的pdb么? 答案:可以,实验如下. 2.实验: 生成一个a.py代码文件,代码如下: import pdb a = 1 print "111" ...
随机推荐
- 分析网络流量Capsa笔记
Capsa是一款网络分析仪,允许您监控网络流量,解决网络问题并分析数据包.通过提供生动的图表,通过设计良好的GUI提供丰富的统计信息和实时警报,Capsa可让IT管理员实时识别,诊断和解决有线和无线网 ...
- Struts学习总结-02 上传文件
Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的目录,以确保数据不丢失. ...
- ES6-课程介绍
ES6 可以提高开发效率,把ES3比做斧头,ES5比做锯子,那么ES6就是电锯. ES6新特性 默认参数.字符串模板.结构赋值.箭头函数.set\mat .异步操作.类和对象 .模块化
- 【转】Oracle中的decode在mysql中的等价实现
以前用的Oracle,里面的Decode函数非常好用,那MySql实现同样的功能用什么呢?——MySql使用if的语法来支持. 格式:IF(expr1,expr2,expr3)如果expr1是TRUE ...
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...
- Vue 实际项目中你可能会遇见问题
纸上得来终觉浅,绝知此事要躬行! Vue的文档和教程看的太多,小的demo做的多,也不如自己实际的进行一个完整项目的开发.只有做了才知道原来问题这么多,这里列举了一些你做demo教程可能不会遇见的坑. ...
- 【转载】固态硬盘的S.M.A.R.T详解
文章来源于: 瑞耐斯存储技术 兵哥写这篇文章,是因为在测试的过程中看到了 SSD存在偶尔有性能下降的情况,经分析为S.M.A.R.T命令所导致,虽然这种情况看似不严重,但如果应用在诸如数据采集等关键性 ...
- testNG-失败用例重跑方法探究
实现IRetryAnalyzer类,重写其中的retry方法public class TestNGRetry implements IRetryAnalyzer { private int retry ...
- 毕业设计 之 三 mooodle及bigbluebutton使用笔记(未完成)
毕业设计 之 三 mooodle及bigbluebutton使用笔记 作者:20135216 平台:windows10 备注:N把辛酸泪 附:在准备过程中其他的一些零碎小问题 一.关于moodle 1 ...
- 软件工程(五)UML
UML 统一建模语言,又称标准建模语言.是用来对软件密集系统进行可视化建模的一种语言.包括UML语义和UML表示法两个元素. UMl图由事物和关系组成,事物:UML模型中最基本的构成元素,是具有代表性 ...