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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值