码迷,mamicode.com
首页 > 其他好文 > 详细

How program is executed

时间:2015-05-06 21:15:09      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

刘柳 + 原创作品转载请注明出处 + 《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

How program is executed

标签:

原文地址:http://blog.csdn.net/titer1/article/details/45541227

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!