How program is executed

刘柳 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

以下从gdb追踪的角度来解释这个问题。

1 准备

生成gdb需要的文件

gdb -g main.c -o main

掌握gdb跟踪堆栈的一些常用命令

start //运行到main程序
si //汇编里面单步
info register ebp esp eip //查看ebp esp eip寄存器的变化
x/11x ADDR //以16进制查看addr地址开始的11个byte

2 操作过程

整个执行的过程,我用视频放在youku.

(注意:实验楼的命令行模式在 标清 下面不是很清楚,请切换到高清及以上)

demo link here

esp前后变化

这里以esp寄存器变化位列,看此图,(si指令表示执行了一条汇编)

3 课后思考

实际追踪发现的问题:

在我们课堂模型中,指令的地址是简单抽象为1开始,并且指令长度为1, 而实际代码中代码起始时未知的,代码长度(x86)是变长的,将会带来一些 挑战,不过理解了老师的模型,将会降低很大难度。

4 总结

本文从实战的角度来验证程序运行的过程。其中最主要的是熟悉进程上下文的切换比如ebp/esp等寄存器的变化(进进出出)。

这里从编程应用角度思考下。

我们不可能每写一个程序,就去拔他的堆栈细节,但是在以下场合非常有必要。

1)代码汇编级的优化

2)查找应用程序内部调用奔溃

3)查找动态库奔溃的原因

4)利用strace来跟踪一个没有源代码的应用程序运行失败的原因

5)利用oops 提供的上下文现场来确定内核奔溃的原因。

内容还可以从stdcall/pascal call等角度展开,

附录

要求

题目自拟,内容围绕计算机是如何工作的进行;

博客中需要使用实验截图

博客内容中需要仔细分析汇编代码的工作过程中堆栈的变化

总结部分需要阐明自己对“计算机是如何工作的”理解。

看到论坛若干大神的大作:

1)gif的神图,一步一步追踪变化。

//为了理解,我制作了 第一章作业 eijsan的 演示图 分解版本

http://mooc.study.163.com/learn/USTC-1000029000#/learn/forumdetail?pid=1000111081

时间: 2024-08-04 16:08:42

How program is executed的相关文章

Coursera compiler Set up environment and Run first program

Environment, Ubuntu 14.04 set up guide Set up cool compiler 1. sudo apt-get install flex bison build-essential csh openjdk-6-jdk libxaw7-dev libc6-i386 2. Make the /usr/class directory sudo mkdir /usr/class 3. Make the directory owned by you sudo cho

Files and Directories

Files and Directories Introduction In the previous chapter we coveredthe basic functions that perform I/O. The discussion centered on I/O for regular files-opening a file, and reading or writing a file. We'll now look at additionalfeatures of the fil

Identify Memory Leaks in Visual CPP Applications(VLD内存泄漏检测工具)

原文地址:http://www.codeproject.com/Articles/1045847/Identify-Memory-Leaks-in-Visual-CPP-Applications 基于CPOL License Identify Memory Leaks in Visual CPP Applications Visual Leak Detector (VLD) is an easy to use memory leak detection system. The installat

[算法]Comparison of the different algorithms for Polygon Boolean operations

Comparison of the different algorithms for  Polygon Boolean operations. Michael Leonov 1998 http://www.angusj.com/delphi/clipper.php#screenshots http://www.complex-a5.ru/polyboolean/comp.html http://www.angusj.com/delphi/clipper.php#screenshots Intro

Android gdb so

gdb debug an android application 1.gdb 要有gdbserver 一般模拟器默认装有gdbserver,如2.3.3的模拟器,看一下有没有: D:\Developer\sdk\platform-tools>adb shell ls -l /system/bin/gdb*-rwxr-xr-x root shell 5664 2010-07-01 05:03 gdbjithelpe-rwxr-xr-x root shell 151868 2010-05-11 09

gcc 生成动态链接库

http://blog.csdn.net/ngvjai/article/details/8520840 Linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为静态库,是好多个.o合在一起,用于静态连接 .la为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息.可以用如下命令查看*.la文件的格式   $file *.la    

Ruby快速入门

Rb是什么 ? 交互式Ruby(IRB)为实验提供了一个shell.内置IRB shell,你可以立即一行行查看表达式的结果.该工具自带Ruby安装,所以你必须做一些额外的IRB工作无关.只需键入在命令提示符IRB和交互式Ruby会话将启动. Ruby语法: Ruby代码一般忽略空白字符,如空格和制表符,除非当他们出现在字符串. Ruby的解释分号作为语句的结尾换行符.但是,如果ruby遇到运算符,如+, - ,或在一行的末尾的反斜杠,他们的声明中表示延续. 标识符名称的变量,常量和方法. Ru

嵌入式linux应用程序调试方法

嵌入式linux应用程序调试方法 四 内存工具 17 4.1 MEMWATCH 17 4.2 YAMD 22 4.3 Electric Fence 24 五 C/C++代码覆盖.性能profiling工具 24 5.1 用gcov来测试代码覆盖率 25 5.2 使用gprof来优化你的C/C++程序 35 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来跟踪稀奇古怪的内存错误问题.应用程序在有的开发工作站上能运行,但在新的产品工作站上,这个应用

Speculative store buffer

A speculative?store?buffer is speculatively updated in response to speculative store?memory operations buffered by a?load/store?unit in a microprocessor. Instead of performing dependency checking for?load?memory operations among the?store?memory oper