反汇编调试死循环

在 《C陷阱与缺陷》中,出现如下的代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
	int i = 0;
	int a[10];

	for(i=0; i<=10; ++i)
	{
		a[i] = 0; // 死循环
	}

	return 0;
}

作者的解释是:如果用来编译这段程序的编译器按照内存地址递减的方式来给变量分配内存,那么最后将赋值给变量 i ,陷入死循环。

将程序在VC6.0 运行,查看反汇编代码:

从结果中,可知内存的分配结果是按照地址递减的方式给变量分配内存的:

结果中,a[i] = 0 的反汇编代码是  mov  dword ptr [ebp+ecx*4-2Ch], 0

其中 ecx 是 i 的数值,ebp - 2CH  = ebp - 44, 实际上就是 a[0] 的位置, i 占4个字节,a[10]占40个字节, 共44个字节。

mov  dword ptr [ebp+ecx*4-2Ch], 0 也即是 mov  dword ptr [ebp-2Ch+ecx*4], 0

就是在a[0] 的地址上,每次加上 i 个单位的整数地址(4个字节)

当最后一个数值 i = 10 的时候, 变成了 mov dword ptr [ebp - 4], 0, 实际上就是给 i 赋值,这条语句就是第一个断点位置的反汇编代码,自然的,i 又被重新赋值为0, 陷入了死循环。

这是自己第一次使用反汇编来调试程序,简单记录 。

时间: 2024-10-13 14:28:34

反汇编调试死循环的相关文章

kset学习demo以及Oops反汇编调试例子【原创】

demo1: obj-m := kmod-demo1.o MAKEOPT := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- ARM_LINUX_KERNEL := /home/zhangbh/5830/zhangbh_svn_si_update/firmware/build_dir/linux-brcm5830_sxxx-prolin2/linux-3.6.5 PWD = $(shell pwd) all: $(MAKE) $(MAKEOPT)

反汇编调试内核驱动 Oops提示

反汇编调试内核驱动 arm-none-linux-gnueabi-objdump -S kmod-demo1.o  > a.txt 什么是Oops?从语言学的角度说,Oops应该是一个拟声词.当出了点小事故,或者做了比较尴尬的事之后,你可以说"Oops",翻译成中国话就叫做“哎呦”.“哎呦,对不起,对不起,我真不是故意打碎您的杯子的”.看,Oops就是这个意思. 在Linux内核开发中的Oops是什么呢?其实,它和上面的解释也没什么本质的差别,只不过说话的主角变成了Linux.当

反汇编调试Android

https://code.google.com/p/android/issues/detail?id=73076 http://my.unix-center.net/~Simon_fu/?p=527 在移植Android过程中会遇到很多Crash的情况,尤其是启动Android过程中.一般这些问题都可以通过看代码能解决,当然也有一些比较“妖娆”的问题,非常难找到头绪,在logcat日志也只会打印一些崩溃的堆栈,这些信息很难帮助我们定位问题.根据个人一个实例来介绍一下在Android移植过程中反汇

Linux内核调试方法总结之反汇编

Linux反汇编调试方法 Linux内核模块或者应用程序经常因为各种各样的原因而崩溃,一般情况下都会打印函数调用栈信息,那么,这种情况下,我们怎么去定位问题呢?本文档介绍了一种反汇编的方法辅助定位此类问题. 代码示例如下: #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <execinfo.h> #include <fcntl.h> #include <

用gdb调试游戏服务端

前言 说说gdb的重要性 一般来说,提到gdb,都是用命令来调试."命令",这个对于用户来说几乎等同于繁杂的词语.尽管事实确实如此,但实际的开发调试必须用到gdb.现在,大多数Linux系统是存在于服务器当中.我们想操作这些系统时,一般是通过Terminal来操作.也就是说这些Linux系统不具有图形界面.而调试一般分两部分,开发时调试和运行时调试.当我们的程序部署到Linux上时,那就需要忘记那该死图形调试器了. 说说写这篇文章的目的 昨天公司游戏的其中服务端崩溃了.我在调试时忘记了

使用Python脚本强化LLDB调试器

LLDB是Xcode自带的调试器,作为一个iOS应用开发程序员,平时我在开发应用时会使用LLDB来调试代码.在逆向应用时,也会用到LLDB来跟踪应用的执行过程. LLDB还内置了一个Python解析器,使用Python脚本可以方便LLDB的调试,比如自动化执行一些命令,或者自动化处理数据之类的,具体说明可以参考官方的文档:LLDB Python Reference. 以下就以一个具体的例子来演示一个Python脚本的编写过程: 一.获取方法的偏移地址 运行系统自带的计算器Calculator.a

使用gdb调试游戏服务器

前言 谈论gdb重要性 一般来说.提gdb,命令用于调试."命令",用户是几乎相同的复杂话.而事实确实如此,实际的开发调试必须用到gdb. 如今.大多数Linux系统是存在于server其中. 我们想操作这些系统时,通常是通过Terminal来操作.也就是说这些Linux系统不具有图形界面.而调试一般分两部分.开发时调试和执行时调试. 当我们的程序部署到Linux上时.那就须要忘记那该死图形调试器了. 说说写这篇文章的目的 昨天公司游戏的当中服务端崩溃了.我在调试时忘记了gdb命令-_

VS 2013驱动程序开发+VM双机调试(亲测+详解)

WIN10已上线,随之而来的是VS2015:微软在 "WDK7600" 以后就不再提供独立的内核驱动开发包了,而是必须首先安装微软集成开发环境VS,然后再从微软官网下载集成的WDK驱动程序开发包.或者离线安装的开发包 地址: https://msdn.microsoft.com/zh-cn/windows/hardware/hh852365.aspx 离线下载地址:百度云链接:http://pan.baidu.com/s/1i3KdUSH 密码:vp41 安装WDK后,本人使用的是VS

致电子系---入门篇 爱做梦的90后

本人现在是一名大三的学生,才疏学浅,现在学的还不够,还需要拼命学习,介于不少的师弟师妹们苦于没方向,不知道要学什么,不知道从何学起,下面仅是提供个人的一些看法和学习经验供人们参考,写的不好的地方还请见谅哈,嘿嘿... 进入大二的同学们,我们就要开始考虑自己的专业方向了,其实越早考虑越好,大一的同学也要利用好自己的大一时间去发现自己的兴趣是什么,自己喜欢做什么事情,因为兴趣是我们最好的导师嘛!我们要去想自己将来喜欢做什么,擅长什么,搞技术不是一天两天能做成的,要长久去做,并坚持去学,更重要的是学会