网站建设知名网站信息抽查评估 短信
web/
2025/10/8 4:28:31/
文章来源:
网站建设知名,网站信息抽查评估 短信,关于网站可信备案,网站开发公司内部数据字典上一篇文章我们学习了如何使用GDB进行软件断点调试和硬件断点调试#xff1a;【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试本篇文章继续上一篇文章的学习#xff0c;如何使用GDB的数据断点监测内存中的变量是否被改变 文章目录1 GDB的数据断点1.1 利… 上一篇文章我们学习了如何使用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.hint 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(i0; i10; 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.outstart 进入到GDB调试模式并启动程序后再程序入口处停止。 然后使用watch命令对g_var变量设置数据断点 watch g_var 并使用info breakpoints 查看断点是否设置成功 上述步骤如下图所示 打好数据断点后让程序执行输入continue命令即可显示如下动态图所示 上述动态图中运行着运行着就停止了停止后显示如下 从上述图中我们可以知道在watch.c程序的thread_func函数中的12行导致了g_var的改变是从Old value0改变到New value1的。我们很容易就找到了发生改变的地方如果在大型程序中这是很快。 当然我们还可以使用上面学习的 x 命令来查看g_var所在内存的内容。首先我们需要查看g_var变量的的内存地址 print /a g_var 输入这条命令显示如下 得到g_var的地址后使用 x 命令查看它的内存查看方式是4单元1字节16进制方式如下图 很明显我们显示了g_var内存地址的连续4字节的内容。 到此我们已经通过这个简单的示例学会了如何检测程序运行过程中的内存变化。例子随简单但是也能够提现内存监测的重要性。
3 总结
本文学会使用GDB 进行内存监测学会如何使用GDB数据断点调试程序
本文章参考狄泰软件学院相关课程 想学习的可以加狄泰软件学院群 群聊号码199546072
学习探讨加个人可以免费帮忙下载CSDN资源 qq1126137994 微信liu1126137994 学习交流资源分享qq群962535112
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88871.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!