GDB调试之暂停
暂停机制: 有3种方式可以通知GDB暂停程序的执行。
a.断点: 通知GDB在程序中的特定位置暂停执行;
b.监视点:通知GDB当特定内存位置(或者涉及一个或多个位置的表达式)的值发生变化时暂停执行;
c.捕获点: 通知GDB当特定事件发生时暂停执行;
容易混淆的是,在GDB文档中将这3个机制都称为断点。这可能是因为它们的很多属性和命令都相同;
GDB关于删除断点的delete命令:删除断点、监视点和捕获点;
GDB中关于“位置”的含义非常灵活,它可以指各种源代码行、代码地址、源代码文件中的行号或者函数的入口等;
设置格式: 文件名:行号
断点可以通过函数名,当前文件内的行号来设置,也可以先指定文件名再指定行号,还可以指定与暂停位置的偏移量,或者用地址来设置;
程序员创建的每个断点(包括断点、监视点、和捕获点)都被标识为从1开始的唯一整数标识符;这个标识符用来执行该断点上的各种操作,
break function 在函数function() 的入口(第一行可执行代码)处设置断点,
例如: break main 在源文件filename的line处设置断点,如果filename不在当前目录中,则可以给出相对路径名或者完全路径名来帮助GDB查找该文件。
例如: break source/bed.c:35 break bed.c:function
临时断点(只生效一次): 使用tbreak命令设置,它与break采用相同类型的参数,
在任何给定时间,GDB都有一个焦点,可以将它看作当前“活动”文件,这意味着除非对命令做了限定。否则都是在具有GDB的焦点的文件上执行命令。
默认情况下,具有GDB的初始焦点的文件是包含main()函数的文件,但是当发生如下任一动作时,焦点会转移到不同的文件上;
1、向不同的源文件应用list命令; list function
2、进入位于不同的源文件文件中的代码;
3、当在不同的源代码文件中执行代码时GDB遇到断点; 在调试会话期间不应退出GDB,
例如,当发现并修复了一个程序错误,但是其他程序错误仍然存在时,不应当退出GDB然后重新进入来使用程序的新版本。这样做有些不必要地繁琐, 而且还会不得不重新进入断点; 如果在修改和重新编译代码时没有退出GDB,那么下次执行GDB是的run命令时,GDB会感知到代码修改,并自动重新加载新版本;
假如要关机了,又想保存GDB的断点等信息;那怎么办呢? 可以将断点放在源代码所在目录的.gdbinit 启动文件中;
例如,当发现并修复了一个程序错误,但是其他程序错误仍然存在时,不应当退出GDB然后重新进入来使用程序的新版本。这样做有些不必要地繁琐, 而且还会不得不重新进入断点; 如果在修改和重新编译代码时没有退出GDB,那么下次执行GDB是的run命令时,GDB会感知到代码修改,并自动重新加载新版本;
如果要波啊流断点以便用户使用,暂时又不希望GDB停止执行; 可以禁用它们,在以后需要时再启用。
使用disable breakpoint-list命令禁用断点。
enable breakpoint-list命令启用断点;
其中breakpoint_list是使用空格分隔的列表,其中有一个或多个断点标识符;
disable不带参数执行,将禁用所有现有断点,enable也一样; i b命令也能指出特定断点引起GDB停止程序执行多是次; 使用commands命令设置命令列表:
其中breakpoint-number是要将命令添加到其上的断点的标识符,commands是用新行分隔的任何有效GDB命令列表。
逐条输入命令,然后键入end表示命令完毕。
从那以后,每当GDB在这个断点处中断时,它都会执行你输入的任何命令。
commands breakpoint-number
......
commands
......
end
例如:
commands 1
printf "var value is %d\n", n
end
对比:
commands 1
silent
printf "var value is %d\n", n
end
GDB的define命令创建宏
define print_and_go
printf "%d\n", n
continue
end
监视点: 它是一种特殊类型的断点,是要求GDB暂停程序执行的指令。
区别在于监视点没有“住在”某一行源代码中,而是,监视点是指示GDB每当某个表达式改变了值就暂停执行的指令。
例如:
watch i 它会使得每当i改变值时GDB就暂停;
display命令(简写disp):这个命令要求GDB在执行中每次有暂停(由于有断点,使用next、step命令等)时就输出指定条目;
disp i 查看i的值; 通过GDB中的call命令来调用源代码中的函数:
例如:
commands 2
printf "************"
call function(参数)
end
人工数组(artificial array)
*pointer@number_of_elements p
p *x@25 GDB中, (监视局部变量)
info locals 命令得到当前栈帧中哦所有局部变量的值列表;
GDB中检查内存 在有些情况下,可能希望检测给定地址的内存,而不是通过变量的名称。
x命令; p/x var GDB中设置当前的某个变量的值;
set x = 12 set args命令设置程序的命令行参数:
set args 1 2 4 检查当前函数参数的info args命令:
全局变量:errno 在文件/usr/include/linux/errno.h 或 /usr/include/asm-generic/errno.h 中有对错误数值的详细解释;
使用strace,跟踪程序做过的所有系统调用;
关于网络的调试,Ethereal程序跟踪单个TCP/IP分组;
与线程相关的GDB命令用法汇总:
确定每个线程在做什么,可以通过 GDB的info threads来确定:
检查线程1: thread 1
break 88 thread 3 (当线程3达到源代码行88时停止执行)
break 88 thread 3 if x==y (当线程3到达3源代码行88,并且变量x和y相等时停止执行)
layout next 命令: 源代码、汇编、二进制之间转换
还有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了每一台计算机中实际使用的4个寄存器的标准名字:
$pc : 程序计数器
$fp : 帧指针(当前堆栈帧)
$sp : 栈指针
$ps : 处理器状态
GDB调试之暂停的更多相关文章
- 【转】 linux编程之GDB调试
GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能: 1 在程序中设置断点,当程序运行到断点处暂停 2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显 ...
- linux基础2——gdb调试器
gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功 ...
- 使用 GDB 调试多进程程序
使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...
- 转 C编译: 使用gdb调试
C编译: 使用gdb调试 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! gdb是the GNU Debugger的简称.它是 ...
- 比较全面的gdb调试命令 (转载)
转自http://blog.csdn.net/dadalan/article/details/3758025 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形 ...
- 用GDB调试多进程程序
在子进程中sleep.然后attach上去. gdb --pid=123456 ps出子进程的id,gdb attach 进程号. http://www.ibm.com/developerworks/ ...
- gdb调试整理
调试环境:linux调试工具:gdb 调试类别 1.调试core文件 gdb 应用程序名 core文件名2.调试正在执行的程序 gdb 应用程序名 pid 3.gdb 应用程序名 4 ...
- linux学习之四---gdb调试
在Linux应用程序开发中,最经常使用的调试器是gdb. 一.启动和退出gdb gdb调试的对象是可运行文件,而不是程序的源码.假设要使一个可运行文件能够被gdb调试,那么使用编译器gcc编译时须要增 ...
- c语言之gdb调试。
1.此文档演示如何使用gdb调试c语言代码. 代码如下: #include <stdio.h> /*函数声明*/ void digui(int n); int main() { ; dig ...
随机推荐
- less 工具
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...
- bzoj 1066 : [SCOI2007]蜥蜴 网络流
题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...
- “use strict”对js的影响
一:全局变量显示声明 在正常模式下,如果一个变量没有声明就赋值,默认是全局变量,严格模式禁止用这种方法.全局变量必须显示声明. ; i++) { function f2() { } // 语法错误 } ...
- Ubuntu12.04获取root权限
有的时候我们需要Ubuntu的root权限,我们该如何获取呢? 其实,很简单,我们只需要在终端中输入以下命令即可获得root权限. 第一步,打开终端 ( ctrl+alt+T ) 第二步,输入命令:s ...
- 《Orange'S:一个操作系统的实现》笔记(一)
感觉自己对于操作系统始终没有一个清楚的概念,尤其最近困扰于实模式.保护模式以及寻址方式等一些概念.转而一想,所有的程序,最终都是操作的计算机资源,需要和操作系统打交道,所以操作系统有必要深入了解一下. ...
- android网络通讯数据封装之 json
Demo程序包括客户端和服务端 客户端按json数据格式封装数据传至服务端. 服务端为简单的servlet程序,负责接收客户端传到json数据,然后按原数据返回客户端. 实例代码如下: public ...
- 利用 Android Studio 和 Gradle 打包多版本APK
在项目开发过程中,经常会有需要打包不同版本的 APK 的需求. 比如 debug版,release版,dev版等等. 有时候不同的版本中使用到的不同的服务端api域名也不相同. 比如 debug_ap ...
- [spring+springmvc+mybatis实践]学生社团管理系统
一.简介 ssm框架为现在十分流行的mvc主流框架.mybatis负责与数据库交互,springmvc与spring完美适配,负责控制器和视图渲染.之前有初步学习过ssm框架,这次借学校里的web课设 ...
- 一步一步学数据结构之1--n(通用树)
今天来看大家介绍树,树是一种非线性的数据结构,树是由n个结点组成的有限集合,如果n=0,称为空树:如果n>0,则:有一个特定的称之为根的结点,它只有直接后继,但没有直接前驱:除根以外的其他结点划 ...
- Oracle 局域网布置数据库服务器,客户端连接提示TNS:无监听器的解决实现
Oracle布置在局域网中的服务器的时候,用本地PL SQL 链接没有丝毫的问题. 但是,如果用远程客户端的PL SQL 链接的时候却出现了“TNS:无监听器”的问题. 首先,就是进行了服务器端的监听 ...