GDB堆栈跟踪与汇编调试
GDB堆栈跟踪与汇编调试
堆栈跟踪
源代码:

对预先编写的
stack.c文件进行编译,并且使用CGDB进行调试,对堆栈进行跟踪,了解该代码堆栈是如何变化的。

- 在
CGDB中,先设置 main 断点,接着运行(run),使用frameinfo frame分别查看当前栈帧的简要信息,以及该栈帧的详细信息。其中:frame打印出的信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。info frame打印出的信息:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。

输入命令
disassemble,显示出该代码(main())的汇编形式

info registers,显示当前(main()处)寄存器值

- 使用
s单步运行程序:运行到 f1 函数内,观察此时堆栈情况

运行到 g1 函数内,观察此时堆栈情况

使用
updown,跳转不同堆栈,查询其中的堆栈简要信息

- 该代码中,共存在过3个堆栈,对每个堆栈查询其详细信息,观察堆栈变化:
由
main()函数形成的堆栈(#2):

由
f1函数形成的堆栈(#1):

由
g1函数形成的堆栈(#0):

根据3个堆栈的详细信息,画出大致的堆栈示图(此时,程序运行在
g1,还没有返回):

汇编调试
GDB指令加上i就显示汇编代码,例如:n(ext)i、s(tep)i,其中:(gdb)p/x i:打印变量名为 i 的十六进制值(gdb) display /3i $pc:这是一种设置,设置好了调试过程中每一步都回显一次,这里是一次显示 3 行,3 在这里是指一次显示几行,不输入,缺省为1(e)xamine:功能和display差不太多,区别就是display是一种设置,每次跳命令显示一次,x是主动显示:x/<n/f/u> <addr>- n选择从当前地址向后显示几个
- f是显示格式,还有s字符串和i整型
- u表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
- 例:x/3uh 0x54320表示,从地址0x54320读取,h表示以双字节为单位,3表示三个单位,u表示十六进制
main、f1、g13个函数所对应的汇编代码:



- 设置
display,每一步显示一行代码,查看当前main()断点处初始的寄存器值(主要观察%eax,%ebx,%esp,%eip)

printf("%d\n,f1(1)+6);,转到fi函数地址处:

int f1(int x){,建立f1函数的堆栈,保存数据,更新信息:



return g1(x);,保存f1函数的数据,之后跳转到g1函数的地址:



int g1(int x),建立g1函数的堆栈,保存数据,更新信息:


return x+5;,进行计算:


},销毁g1函数的堆栈,并且回到从f1函数跳出来的下一条指令:


},销毁f1函数的堆栈,并且回到从main函数跳出来的下一条指令:


printf("%d\n,f1(1)+6);,进行运算,并且转到执行printf
的代码处,使之打印出最终结果:





栈帧变化
- 其中,每条代码指令为正在执行的代码,所有后面的%esp、%ebp、%eax以及栈帧情况都是上一条指令的结果,在等待正在执行的指令完成后再更改

参考资料
GDB堆栈跟踪与汇编调试的更多相关文章
- GDB中汇编调试
GDB中汇编调试 1.输入代码 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,时遇到问题使用-m32指令报错,参考卢肖明同学博客知道这是 ...
- Xdebug文档(三)堆栈跟踪
当xdebug激活时,PHP一旦要显示通知.警告或错误时,xdebug 显示堆栈跟踪信息.这个堆栈信息能跟据你的需要来配置显示. Xdebug显示的堆栈跟踪都是以保守数量状态显示信息.因为大量的信息处 ...
- Dynamics AX 2012 R2 堆栈跟踪:不能对客户端调用'unchecked'
有一个Custom Service一直在正常使用.今天,Reinhard尝试在JOB中以X++代码Debug Custom Service的Method时,收到以下错误提示: 'unchecked' ...
- C++异常中的堆栈跟踪
C++语言的运行时环境是基于栈的环境,堆栈跟踪(trace stack)就是程序运行时能够跟踪并打印所调用的函数.变量及返回地址等,C++异常中的堆栈跟踪就是当程序抛出异常时,能够把导致抛出异常的语句 ...
- 几个简单的例子让你读懂什么是JAVA的堆栈跟踪
简单的来说,堆栈跟踪就是我们的程序在抛出异常时使用的方法调用列表. 简单的例子 通过问题中给出的示例,我们可以准确地确定应用程序中抛出异常的位置. 我们来看看堆栈跟踪: Exception in ...
- Lab_1:练习5——实现函数调用堆栈跟踪函数
题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_stackframe来跟踪函数调用堆栈中记录的返回地址.如 ...
- windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境
windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境 http://rongmayisheng.com/post/windows%E4%B8%8B%E7%94%A ...
- 使用StackTrace堆栈跟踪记录详细日志(可获取行号)
上一篇我们提到使用.NET自带的TraceSource实现简单的日志,具体请看<轻松背后的N+疲惫——系统日志>,这一篇注意想讲的是日志的详细记录,包含请求开始到结束的过程中调用的方法链以 ...
- StackTrace堆栈跟踪记录详细日志
使用StackTrace堆栈跟踪记录详细日志(可获取行号) 2014-04-25 22:30 by 螺丝钉想要螺丝帽, 350 阅读, 3 评论, 收藏, 编辑 上一篇我们提到使用.NET自带的Tra ...
随机推荐
- linux下使用正确的用户名密码,本地无法连接mysql
问题现象: Linux系统为CentOS 7.0 64位,通过IP远程mysql时,可以正常访问,确定账号密码没有问题.但是本地连接mysql时,提示ERROR 1045 (28000): Acces ...
- java Hello 出现以下结果:Bad command or the file name 可能是什么原因
没有这个命令或文件名 原因可能是没有成功安装jdk或者没有配置好jdk 的环境变量,或者没有编译相应的文件. 2. 出现以下结果:Exception in thread “main” java.lan ...
- MYSQL界面操作系统之phpMyAdmin
linux下: 需要PHP环境支持,安装PHP自行百度 下载linux-phpMyAdmin,并解压 php -S 127.0.0.1:8081 -t phpMyAdmin/
- 轮式移动机器人QBot的使用
夏季学期选了智能移动机器人导论课程,开始接触移动机器人.作为一门面向大二.大三学生的一门导论式的课程,课程作业其实并不太难,然而我们为了完成课程作业,前前后后还是弄了好几个星期,以至放了暑假都还要和Q ...
- 基于jython操作hbase
一.前言 关于jython介绍,直接上官网www.jython.org,可以得到详细资料,这里只介绍一下jython操作hbase的一些方法,本质上和用java操作hbase差不多,只不过语法换成了p ...
- 《致命接触》:人畜共患传染病的故事,SARS一章非常精彩,四星推荐
讲人畜共患的传染病的故事:亨德拉.埃博拉.疟疾.SARS.Q热.鹦鹉热.莱姆病.艾滋病等.作者比较会讲故事,又熟悉病毒传播相关的各种学科的知识(病毒学.生态学,还有一些我没记住的相关小学科),能把相关 ...
- 电磁兼容设计经验(转载 原文电子科技大学硕士毕业论文DDS扩频技术研究)
2 Corinthians 1:3-4“[Praise to the God of All Comfort] Praise be to the God and Father of our Lord J ...
- #include <NOIP2008 Junior> 双栈排序 ——using namespace wxl;
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- c++仿函数 functor
内容整理自国外C++教材 先考虑一个简单的例子:假设有一个vector<string>,你的任务是统计长度小于5的string的个数,如果使用count_if函数的话,你的代码可能长成这样 ...
- Trie树-可持久化
// Made by xiper // updata time : 2015 / 12 / 8 // test status: √ // 使用前调用初始化函数 init() 同时 root[0] = ...