一起talk GDB吧(第七回:GDB监视功能)
各位看官们。大家好。上一回中我们说的是GDB改动程序执行环境的功能。而且说了怎样使用GDB改动变量
的值。这一回中。我们继续介绍GDB的调试功能:监视功能。当然了,我们也会介绍怎样使用GDB的监视功
能。闲话休提,言归正转。让我们一起talk GDB吧!
我们说的监视类似像电影中描写叙述的哪种监视。仅仅只是电影中的被监视对象一般是一些犯罪嫌疑人,而我们
的监视对象是执行着的程序,更详细点说。是程序中的存储单元地址。GDB提供了监视功能,首先设置一个
监视点,GDB会自己主动监视该监视点上的变化了,假设监视点发生了变化,GDB就会在监视点哪里停下来,这
时候,我们就能看到是谁让监视点发生了变化。我来总结一下详细的步骤:
1.设置一个监视点。样例:watch giVal 该样例表示在giVal所在的存储单元哪里设置一个监视点。
2.先使用start命令開始调试。当有程序改动监视点的存储单元时它就会停下来。
3.使用c命令会再次执行程序,直到有程序操作观察点监视的存储单元时再次停下来。
光说不练,不是我们的风格,接下来,我们用详细的样例来说明怎样使用监视功能。
#include<stdio.h> int g; void fun()
{
g = 3;
} int main()
{
int a,b;
a = 3;
b = 5;
g = a+b; printf("a+b = %d \n",g);
fun();
printf("a+b = %d \n",g); return 0;
}
1.编敲代码。打开VIM,输入上面的程序,而且保存到m.c文件里
2.编译程序。
在终端中输入:gcc -g m.c -o s
3.执行程序。在终端中输入:./s ,得到下面执行结果:
./s
a+b = 8
a+b = 3
大家能够看到程序中a=3,b=5,a+b=8这是小学生也会的数字呀。但是程序第一次输出运算结果时还正确,
第二次输出运算结果时就不对了,这是怎么回事?看官莫急,我们使用GDB的监视功能来调试一下。非常
快就能知道。
谁改动了这个全局变量。
在终端中输入:gdb s //使用GDB调试程序
(gdb) watch g
//设置一个监视点。监视全局变量g
Hardware watchpoint 1: g
(gdb) start //開始调试
Temporary breakpoint 2 at 0x8048435: file m.c, line 13.
Starting program: xxx/s
Temporary breakpoint 2, main () at m.c:13
13 a = 3;
(gdb) c
//继续调试程序,直到监视点g发生变化
Continuing.
Hardware watchpoint 1: g
Old value = 0 //这里显示监视点发生了变化,而且列出了变化前后的值
New value = 8 //这时的运算结果是正确的
main () at m.c:17
17 printf("a+b = %d \n",g);
(gdb) c
//运算结果正确。继续调试程序,直到监视点g发生变化
Continuing.
a+b = 8
Hardware watchpoint 1: g
Old value = 8 //这里显示监视点发生了变化,而且列出了变化前后的值
New value = 3 //g的值从8变成了3
fun () at m.c:8
//提示程序中第8行
8 }
(gdb) list 8 //观看程序中第8行的内容
3 int g;
4
5 void fun()
6 {
7 g = 3;
//大家看到了吧,原来是fun函数改动了g的值。
8 }
9
10 int main()
11 {
12 int a,b;
(gdb) stop //结束调试
我们通过这个样例说明了怎样在调试过程中使用监视功能来调试程序,而且找出了错误发生的原因。只是
该样例比較简单,我们细致观察一下程序就能发现是fun函数改动了运算结果。
在实际的程序中,就不会
像样例中这么简单了。希望看官们可以举一反三。灵活使用监视功能调试程序。
监视功能也是GDB中一个十分强大的功能,在调试全局变量被改动,或者数组越界错误很实用。
会C语言
的看官们都知道,全局变量是C程序中一个十分让人头疼的东西,在有些程序中甚至不同意使用全局变量。
使用GDB的监视功能能够监视全局变量的一举一动,仅仅要全局变量发生了变化,它就会停止下来。因此可
以把监视功能看作是全局变量的克星。
看官们,关于GDB的内容,今天咱们就讲到这里。欲知后事怎样,且听下回分解!
一起talk GDB吧(第七回:GDB监视功能)的更多相关文章
- 用GDB调试程序(七)
改变程序的执行——————— 一旦使用GDB挂上被调试程序,当程序运行起来后,你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值,这个强大的功能能够让你更好的调试你的 ...
- GDB学习之道:GDB调试精粹及使用实例
一:列文件清单 1. List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出 ...
- [skill][debug][gdb] 使用core dump 进行GDB
core dump 扫盲:https://wiki.archlinux.org/index.php/Core_dump 1. 人为制作 core dump 1.1 实时在线生成core dump. ...
- Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件
交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gd ...
- GDB调试系列之了解GDB
想要熟练利用GDB进行程序调试,首先要了解什么是GDB. 1. 什么是GDB GDB (the GNU Project Debugger) 是一个可以运行在大多数常见的UNIX架构.Windows.M ...
- Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身
Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身 Bing Maps Silverlight Control所提供的功能导航是非常强大的,在设计上对扩展的支持非常好,提供了许多用 ...
- 第七课 GDB调试 (下)
1序言: 通过前面一节第六课 GDB调试 (下)文章,可以掌握理解了gdb调试:怎么启动.运行,打断点.查看变量.甚至改变变量等的知识,今天来大概讲解下调试bug的类型. 2知识点: 2.1 就像之前 ...
- gdb常用命令及使用gdb调试多进程多线程程序
一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...
- 缓存篇~第七回 Redis实现基于方法签名的数据集缓存(可控更新,分布式数据缓存)
返回目录 本篇文章可以说是第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存(可控更新,WEB端数据缓存)的续篇,事实上,有 ...
随机推荐
- java的Future使用方法
首先,Future是一个接口,该接口用来返回异步的结果. package com.itbuluoge.mythread; import java.util.ArrayList; import java ...
- Swift学习之类和结构体的创建
随着一步步的学习,学习到的新知识越来越多了,不管是新的还是旧的,都禁不住时间的堆积,再熟悉的知识点时间久了都会渐渐的忘记,也许这就是人们生活中一种潜在的惰性吧,看似非常熟悉的东西,等到真正要用的时候, ...
- linux用户创建删除以及文件权限查看修改
一. 1.查看用户 命令如下:whoami 2.创建用户 创建用户命令:sudo adduser hello 超级用户是 root 删除用户名命令:sudo deluser hello --remov ...
- WEB服务器5--IIS中ISAPI扩展、ISAPI筛选器
在IIS的文档中经常会提到两个术语:ISAPI扩展和ISAPI筛选器. ISAPI扩展 “ISAPI扩展(ISAPI Extension)”是一种可以添加到IIS中以增强Web服务器功能的程序,其载体 ...
- HTTP协议4之缓存--转
HTTP协议提供了非常强大的缓存机制, 了解这些缓存机制,对提高网站的性能非常有帮助. 缓存的概念 缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP. ...
- ora-24247:网络访问被访问控制列表(ACL)拒绝
用dba账户使用下面脚本授予报错账户访问外部网络服务的权限,以SCOTT为例: BEGIN -- Only uncomment the following line if ACL "netw ...
- android——ImageLoader添加缓存
//给图片加入到缓存中. DisplayImageOptions options = new DisplayImageOptions.Builder().cacheOnDisc( ...
- python os模块文件相关
使用前 import os导入模块 os模块: os.sep 可以取代操作系统特定的路径分割符 os.linesep 字符串给出当前平台使用的行终止符.例如,Windows使用'\r\n ...
- eclipse中多个工程编译到同一个目录下
1.点击link source 2.选择Java(ps:Java文件目录)或者resource(ps:配置文件目录) 3.最后结果,然后使用project中的clean进行编译,就可以把两个工程编 ...
- html表格,列表
1. 表格由 <table> 标签来定义.每个表格均有若干行(由 <tr> 标签定义),每行被分割为若干单元格(由 <td> 标签定义).字母 td 指表格数据(t ...