GDB堆栈跟踪与汇编调试

GDB堆栈跟踪与汇编调试

分析过程

?使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编 出现错误:fatal error

这时需要下载安装库文件

命令:sudo apt-get install libc6-dev-i386

之后再进行一次操作就可以产生汇编了

?使用gdb gdb1指令打开gdb调试器

?使用break main指令在main函数处设置断点,并记得先用r指令运行代码,可以看到运行时在main函数位置停了下来,否则会出现如图的错误:

?使用disassemble指令获取汇编代码(因为之前执行的命令中有-m32,所以此处显示的是32位汇编代码)

?用i r指令查看各寄存器的值

?可见此时主函数的栈基址为0xffffd068,用x 0xffffd068指令查看内存地址中的值:

由此,当前%esp所指堆栈内容为0,%ebp所指内容也为0

?使用display /i $pc(结合display命令和寄存器/pc内部变量)指令进行设置

这使得在每次执行下一条汇编语句时,都会显示出当前执行的语句,方便查看。

?依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:

?(1)、使用si指令单步跟踪一条机器指令

?(2)、使用i r指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)

?(3)、使用x/na %esp对应的值指令查看堆栈变化

之后一直重复执行上述三步,直至结束

?main函数汇编代码

?从main函数开始,push $0x13分配4字节的栈空间,并且设置arg1=19

?call调用f(0x80483e6)

?执行f函数,f初始化帧指针,将上一个函数的基址入栈,将当前%esp作为新基址

?f分配栈空间,为传参做准备

?pushl 0x8(%ebp)将%esp中的8存入栈中

?call调用g(0x80483db)

?执行g函数,g初始化栈指针

?g分配栈空间

?pushl 0x8(%ebp)将%esp中的8存入栈中

?将 %eax 与立即数 19 相加

?pop %ebp在g结束前弹栈

?ret返回g中call的调用位置,结束g函数

?将 %esp 与立即数 4 相加

?leave返回准备栈

?ret返回f中call的调用位置,结束f函数

?进入main函数,将 %esp 与立即数 4 相加

?将 %eax 与立即数 19 相加

?leave返回准备栈

?ret结束main函数

时间: 2024-10-27 16:40:26

GDB堆栈跟踪与汇编调试的相关文章

每天进步一点点——Linux系统中的异常堆栈跟踪简单实现

转载请说明出处:http://blog.csdn.net/cywosp/article/details/25002201 在Linux中做C/C++开发经常会遇到一些不可预知的问题导致程序崩溃,同时崩溃后也没留下任何代码运行痕迹,因此,堆栈跟踪技术就显得非要重要了.本文将简单介绍Linux中C/C++程序运行时堆栈获取,首先来看backtrace系列函数--使用范围适合于没有安装GDB或者想要快速理清楚函数调用顺序的情况 ,头文件execinfo.h int backtrace (void **

解码混淆过的堆栈跟踪信息

当混淆后的代码输出一个堆栈信息时,方法名是不可识别的,这使得调试变得很困难,甚至是不可能的.幸运的是,当ProGuard运行时,它都会输出一个<project_root>/bin/proguard/mapping.txt文件,而这个文件中包含了原始的类,方法和字段名被映射成的混淆名字. retrace.bat脚本(Window)或retrace.sh脚本(Linux,Mac OS X)可以将一个被混淆过的堆栈跟踪信息还原成一个可读的信息.它位于<sdk_root>/tools/pr

【转】堆栈跟踪中收到一个UnhandledExceptionFilter调用时,如何查找问题异常堆栈

定义没有异常处理程序来处理引发的异常时调用UnhandledExceptionFilter函数.函数通常将异常传递到捕获并处理它所尝试的 Ntdll.dll 文件. 在某些情况下,在其中存在的进程内存快照,您可以看到一个线程持有的锁点的线程调用UnhandledExceptionFilter函数.在这些情况下,您可以按照本文来标识导致异常的 DLL 中的步骤. 通过使用 Windbg.exe 打开转储文件 下载并安装调试程序.若要下载调试程序,请访问下面的 Microsoft 网站:Micros

跟踪Makefile输出调试信息

/********************************************************************* * 跟踪Makefile输出调试信息 * 说明: * 有时候为了了解项目的Makefile是怎么工作的,需要加入一些调试信息, * 查看一些变量状态,来判断编译流程是如何进行的. * * 2017-8-14 深圳 龙华樟坑村 曾剑锋 **************************************************************

JVM中常用堆栈跟踪内建指令

在使用Java的程序中难免会遇上程序异常的现象,此时就可以使用JDK下的jstack和jmap来跟踪观察JVM中的内存堆栈信息用以分析,不过注意的是如果是在windows版本或者是开源版中一般都是没有的,如果需要使用需要安装相应的开发调试工具,下面就简单的说一说: jstack 一般而言之后跟着都是Java程序运行的pid或者是相应的Java代码文件,如:jstack $pid,平时可以把相关的堆栈信息再导出到某一个文件中正用以进一步观察,如:jstack $pid > file.dump jm

gdb汇编调试tips

1.内存查看命令x. x/x 以十六进制输出 x/d 以十进制输出 x/c 以单字符输出 x/i  反汇编 – 通常,我们会使用 x/10i $ip-20 来查看当前的汇编($ip是指令寄存器) x/s 以字符串输出 (gdb) x/10i main 0x80483bb <main>: push %ebp 0x80483bc <main+1>: mov %esp,%ebp 0x80483be <main+3>: and $0xfffffff0,%esp 0x80483c

gdb中一些常用的调试命令

show version :显示gdb版本信息 info functions :列出可执行文件的所有函数名称 step(缩写s):进入函数(函数必须有调试信息) next(缩写n):不进入函数,gdb会等函数执行完,再显示下一行要执行的程序代码 finish:当单步调试一个函数时,如果不想继续跟踪下去,使用finish,函数会继续执行完,并且打印返回值 return 或者return expression :命令指定函数的返回值 call 或print :如call func(),该命令直接调用

Linux学习: 使用gdb和gdbserver进行远程调试

1.引言 在日常程序开发中不免遇到类似空指针操作导致程序崩溃的问题,所以需要一定的手段去定位bug,而断点调试是普遍使用的技巧,比如Windows中用VC++的debug模式进单步运行.断点调试等,有很友好的图形化操作界面,而在Linux中使用的是没有图形界面的调试工具-GDB(听说eclipse支持GUI调试,暂未尝试),所以需要通过指令进行操作,下面逐步介绍gdb调试环境的搭建和使用方法. 2.gdb调试环境搭建 (1)下载gdb工具源码:http://www.gnu.org/softwar

GDB调式工具的简单调试步骤

程序编译: gcc xx.c -o xx -g //一定要加-g 开始调式: gdb xx //进入调式界面 l:显示文件,默认10行main函数 l+函数名 //显示函数 b:插入断点 b + 行号(main函数) b + 文件名:行号 b + 函数名 r:运行程序 n:单步运行,不进入自定义函数 s:单步运行,进入自定义函数 c:继续执行到下一个断点,没有断点执行到程序结束 p:查看变量 p + i //查看变量i p + 表达式 //查看表达式的值