【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变

  • 上一篇文章我们学习了如何使用GDB进行软件断点调试和硬件断点调试:【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试
  • 本篇文章继续上一篇文章的学习,如何使用GDB的数据断点监测内存中的变量是否被改变

文章目录

  • 1 GDB的数据断点
    • 1.1 利用查看内存的x命令进行系统大小端的判断
  • 2 使用GDB进行监视变量的改变与查看内存实际代码案例分析
  • 3 总结

1 GDB的数据断点

先来了解一下什么是GDB中的数据断点:

  • 在GDB中设置数据断点用于监测一个内存中的变量,在程序运行的时候,如果该变量被改变,则程序就会被GDB终止执行,并显示变量被改变的地方。
  • 数据断点的本质是硬件断点
  • 在GDB中使用watch命令来设置数据断点
  • watch命令的用法为:watch var_name

可以使用watch进行设置数据断点,我们还可以查看程序运行中的所有内存中的数据。

命令语法为:

  • x /Nuf address

其中/Nuf中的N、u、f三个位置的含义是:

  • N - 需要打印的单元数
  • u - 每个单元的大小,比如字节,字,双字等
  • f - 数据打印的格式 ,如八进制,十六进制等

如下图示例是显示4个单元,每个单元为1字节,以十六进制数显示:
在这里插入图片描述

  • x 命令中参数u对应的几种单位:
    在这里插入图片描述

  • 打印格式对应的几种选项:
    在这里插入图片描述

1.1 利用查看内存的x命令进行系统大小端的判断

学会了x命令的用法,可以按如下图的方式判断系统大小端:

在这里插入图片描述

2 使用GDB进行监视变量的改变与查看内存实际代码案例分析

watch.c程序

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>int g_var = 0;void* thread_func(void* args)
{sleep(5);g_var = 1;
}int main()
{int i = 0;pthread_t tid = 0;pthread_create(&tid, NULL, thread_func, NULL);for(i=0; i<10; i++){printf("g_var = %d\n", g_var);sleep(1);}
}

上面的程序非常的简单,就是在main函数中创建一个线程thread_func,然后在thread_func函数中改变一个全局变量

首先我们先编译运行上述程序:

  • gcc -g -lpthread watch.c -o test.out

运行结果如下动态图:
在这里插入图片描述

  • 我们可以看出,我们程序跑着跑着g_var变量就变了。假设这个变量我们不想让它改变,但是有时候你调用了其他人写的接口函数,很有可能就把我们不想改变的变量改变了,所以这个时候需要找到变量在什么时候被改变,以及在哪里被改变。

  • 上述是一个小程序所以我们很容易知道是在thread_func函数中改变的g_var变量,而且也能够知道在什么时候变量被改变。但是如果在一个大型程序中,就很难查找。

  • 此时GDB的数据断点就派上用场了。

我们可以使用GDB对变量g_var进行数据断点的设置,当g_var发生变化时,程序就会自动停止运行,此时我们就可以知道程序运行到哪里了。

首先依次输入以下命令:

  • gdb tset.out
  • start

进入到GDB调试模式并启动程序后再程序入口处停止。
然后使用watch命令对g_var变量设置数据断点:

  • watch g_var

  • 并使用info breakpoints 查看断点是否设置成功
    上述步骤如下图所示:
    在这里插入图片描述

  • 打好数据断点后让程序执行,输入continue命令即可,显示如下动态图所示:
    在这里插入图片描述

  • 上述动态图中,运行着运行着就停止了,停止后显示如下:
    在这里插入图片描述

  • 从上述图中我们可以知道在watch.c程序的thread_func函数中的12行,导致了g_var的改变,是从Old value=0改变到New value=1的。我们很容易就找到了发生改变的地方,如果在大型程序中,这是很快。

  • 当然,我们还可以使用上面学习的 x 命令,来查看g_var所在内存的内容。首先我们需要查看g_var变量的的内存地址:

  • print /a &g_var 输入这条命令,显示如下:
    在这里插入图片描述

  • 得到g_var的地址后,使用 x 命令查看它的内存,查看方式是4单元,1字节,16进制方式,如下图:
    在这里插入图片描述

  • 很明显,我们显示了g_var内存地址的连续4字节的内容。

  • 到此,我们已经通过这个简单的示例,学会了如何检测程序运行过程中的内存变化。例子随简单,但是也能够提现内存监测的重要性。

3 总结

  • 本文学会使用GDB 进行内存监测
  • 学会如何使用GDB数据断点调试程序

本文章参考狄泰软件学院相关课程
想学习的可以加狄泰软件学院群,
群聊号码:199546072

学习探讨加个人(可以免费帮忙下载CSDN资源):
qq:1126137994
微信:liu1126137994
学习交流资源分享qq群:962535112

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AllTray-将办法最小化到琐细托盘

Toy Posted in AppsAllTray 是一个很有效的小办法&#xff0c;操纵它你可以将办法的窗口最小化到琐细托盘&#xff0c;从而腾出桌面空间以作它用。此办法主要为那些没有原生供给最小化到琐细托盘成效的办法而预备的。今朝&#xff0c;AllTray 可以在 GNOME、KDE、Xfce、Fluxbox…

【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看

上一篇文章学习了如何使用GDB数据断点进行内存监测&#xff1a;【软件开发底层知识修炼】十五 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变本篇文章继续上一篇文章的学习&#xff1a;如何使用GDB进行函数调用栈的查看 文章目录1 backtrace和frame2 使用GDB进行函数调…

前端学习(221):字体属性

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>CSS字体属性…

nload实时查看linux服务器网络流量的工具

如果你仅仅是想查询当前服务器的带宽,nload绝对是个很好用的一个工具,功能虽然很单一,但是很强.虽然不能像iptraf那样,可针对IP, 协议等条件来查询,可以实时地监控网卡的流量,分输入流量Incoming 和输出流量Outgoing两部分,同时统计当前,平均,最小,最大,总流量的值,并且用动态图…

前端学习(222):文本属性

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>CSS文本属性…

【软件开发底层知识修炼】十八 快速学习GDB调试五 使用GDB进行调试的一些小技巧

上一篇文章学习了如何使用GDB进行函数调用栈的查看&#xff1a;【软件开发底层知识修炼】十六 快速学习GDB调试四 使用GDB进行函数调用栈的查看本篇文章是GDB调试快速学习系列的最后一篇。将综合前几篇文章做一个小的总结以及介绍一些在调试中使用的小技巧 文章目录1 调试中的小…

MongoDB学习笔记(一) MongoDB介绍及安装

系列目录 MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据MongoDB学习笔记(四) 用MongoDB的文档结构描述数据关系MongoDB学习笔记(五) MongoDB文件存取操作MongoDB…

【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录

本文记录之前写过的5篇关于GDB快速学习的文章&#xff0c;从第一篇开始学习到最后一篇&#xff0c;保证可以从入门GDB调试到熟练掌握GDB调试的技巧。 学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 …

前端学习(224):iconfont矢量库

矢量库 一、如何下载iconfont图标。 在iconfont-阿里巴巴矢量图标库中有多种图标供你选择。比如我们选择其中的一个作为示例。 鼠标悬浮上后会出现三种选择&#xff1a; 1.添加入库&#xff1a;功能和淘宝中的购物…

如何转载别人的博客

前言 对于喜欢逛CSDN的人来说&#xff0c;看别人的博客确实能够对自己有不小的提高&#xff0c;有时候看到特别好的博客想转载下载&#xff0c;但是不能一个字一个字的敲了&#xff0c;这时候我们就想快速转载别人的博客&#xff0c;把别人的博客移到自己的空间里面&#xff0c…

Spoken English(015)

I know what you want Is that why you don’t want to go home I’m sure we can get you a great/good deal Would you help me with the report I didn’t konw he was the richest person in the world I’ll have to ask my boss/wife first I take it you don’t agree I…

【软件开发底层知识修炼】二十 深入理解可执行程序的结构

上一篇文章记录了GDB调试从入门到熟练掌握的学习全过程。点击链接查看&#xff1a;【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录 还记得在以前的学习Binutils工具的时候&#xff0c;学习了很多工具来查看可执行程序的结构&#xff0c;那个时…

前端学习(225):尺寸属性

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>CSS尺寸属性…

SQL Tree解法

create table tb(id varchar(3) , pid varchar(3) , name varchar(10)) insert into tb values(001 , null , 广东省) insert into tb values(002 , 001 , 广州市) insert into tb values(003 , 001 , 深圳市) insert into tb values(004 , 002 , 天河区) insert into tb valu…

前端学习(226):定位使用

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>CSS定位<…

【数据结构与算法-java实现】三 Java数组类实现

上一篇文章学习了&#xff1a;最好、最坏、平均、均摊时间复杂度的计算与分析方法.本片文章学习数组这种结构。由于数组这种结构比较简单&#xff0c;本文直接简单介绍&#xff0c;然后给出两种实现数组类的Java代码:整形数组类与通用性的数组类 由于数组是相比于其他数据结构实…

解决VMware6.5 以上版本安装RHEL 5的自动安装的问题

解决VMware6.5 以上版本安装RHEL 5的自动安装的问题记得在学习 RHEL5的时候&#xff0c;教室里用的VMware5.5.3的版本&#xff0c;在教室里安装的时候是很正常的有步骤的那种&#xff0c;回到寝室后&#xff0c;用我的VMware6.5 安装的时候却发现&#xff0c;完全变成了自动安装…

远程桌面复制文件,由于网络或其他原因被意外中断,后来再连上远程桌面就无法复制了,而且复制文件的对话框也无法取消,可以试试下面的方法,实测有效:

1&#xff1a;打开任务管理器 2&#xff1a;找到结束进程rdpclip&#xff0c;找不到可以不管。 3&#xff1a;手工新建任务里输入rdpclip&#xff0c;运行即可。

TreeTemplate树模板

将创建树形数据结构抽象出功能类 1   usingSystem.Collections.Generic;2   usingSystem;3 4   publicclassTreeTemplate<T>5   {6     privatereadonlyList<T>_data newList<T>();7 8   publicTreeTemplate(List<T>items)9   {10   …

【软件开发底层知识修炼】二十一 ABI-应用程序二进制接口一

前面学习了可执行程序的结构&#xff0c;点击链接查看上一篇文章&#xff1a;【软件开发底层知识修炼】二十 深入理解可执行程序的结构本篇文章开始新的篇章&#xff0c;学习应用程序的二进制接口-ABI。 文章目录1 什么是ABI&#xff08;Application Binary Interface&#xff…