| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2516 人关注过本帖
标题:单步执行的原理是什么?
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
已结贴  问题点数:0 回复次数:6 
单步执行的原理是什么?
一直对于debug调试程序中的单步执行挺好奇的,刚也在google上找了一下,也基本没有介绍这方面的原理,请问这个功能是怎么实现的呢?程序的执行按理是连贯的,怎么能让它停下脚步休息下呢?
搜索更多相关主题的帖子: 原理 
2010-05-28 00:02
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:5 
推荐一本书
【操作系统精髓与设计】
http://beyondjhf-2008.
上面网址是别人的理解,可以参考下,

想象力征服世界
2010-05-28 00:38
miaowangjian
Rank: 2
等 级:论坛游民
帖 子:34
专家分:30
注 册:2010-1-29
收藏
得分:5 
回复 楼主 vfdff
    在保护模式下,处理器会在一些特殊情况下产生 “异常”中断,也就是出现某种特定情况,就终止当前正在执行的程序,跳转到一个(由操作系统指定的)中断处理函数。根据 异常中断 的不同,以及其他情况,选择是否跳回原先执行的程序,或是启动其他程序,或是干脆宕机

   此表是处理器已经定下的,内部中断。
中断向量号   触发原因
0x00           除零错
0x01           调试异常
0x02           非可屏蔽中断 (NMI)
0x03           断点 (INT 3 指令)
0x04           溢出 (INTO 指令)
0x05           越界 (BOUND 指令)
0x06           无效的指令
0x07           无协处理器
0x08           双重错误
0x09           协处理器越界
0x0A           无效的 TSS
0x0B           段不存在
0x0C           栈溢出
0x0D           通用保护异常(内存引用或其他检查保护),Windows 9x 蓝屏就是它的杰作
0x0E           页错误
0x0F           Intel 保留
0x10           协处理器错误
0x11-0x19      Intel 保留
   在运行时,触发这些中断,有可能是程序无意间发生的(程序员没写好代码,或是操作系统的错误),还有可能是程序自动故意引发的(比如执行 ud2 汇编指定,会产生 中断向量号为 0x06 的 无效指令 异常中断)
   仔细看看,可以发现中断向量号为0x01 的叫做 调试异常 的异常中断。说明这个是专门留给操作系统和程序作为调试用的。

   怎么利用  调试异常中断 来制作调试器呢?
   首先,程序执行前,需要通过一个叫做 加载器 的东西 将二进制机器指令从外存(硬盘,u盘等)加载到内存里面。加载器在加载程序时,会根据程序的执行文件类型,做一些处理(具体的和调试器没什么关系,就不解释了)。
   而调试器,可以看做是一个特殊的加载器,它会在加载程序时,在每一个机器指令间,插入一条调试异常中断指令(int 0x01)。然后,在加载的程序执行时,每执行一条机器指令,就会引发一个调试异常,然后调试器从操作系统的调试异常处理函数那里接过执行权,进行判断,是否在这条指令后设置了调试断点?若设置了,就中断下来,显示程序与cpu寄存器的状态等直到用户按下继续执行的按钮。若没有设置调试断点,就将执行权交回给被调试的程序继续执行下一条指令,然后再触发调试异常中断。。。。。如此不断循环判断执行,直到结束。
   (由于每条指令,都会进行这些判断,被调试的程序执行速度,一般与正常状态下的执行速度慢上好几个数量级

   以上,就是调试器的基本原理,更多的信息,你可以到 看雪 之类的网站看看。


[ 本帖最后由 miaowangjian 于 2010-5-28 01:47 编辑 ]
2010-05-28 01:42
user_ABCDEFG
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-06-18 11:27
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 3楼 miaowangjian
和专家的介绍基本一致
我本来也只是想在听专家讲解时大概有所了解

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-07-04 01:40
malpower
Rank: 1
等 级:新手上路
帖 子:26
专家分:9
注 册:2010-7-2
收藏
得分:0 
是通过设置标志寄存器中单步位实现的。
在设置了单步位后,该选择子内代码的执行会有以下规律:
每执行一条指令会发生一个调试异常,至于中断号,三楼的大虾已列出。
中断发生,在跳入中断处理程序后,堆栈中会包含发生中断(异常)的位置。
通过这个位置,调试器可反编译指令并显示给用户。
中断处理程序执行完毕后返回中断前的下一条指令。

小弟学浅,望大虾们批评。
2010-07-10 00:57
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
是的,通过一种叫RTL的格式保持中间结果!

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-08-05 23:21
快速回复:单步执行的原理是什么?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016111 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved