注册 登录
编程论坛 汇编论坛

问个debug调试的问题(问题部分解决 万分感谢高人ONEPROBLEM)

zklhp 发布于 2008-07-05 21:43, 3473 次点击
用debug调试时  遇到 int 3h 的断点后 如何使程序继续运行?


D:\MASMPlus\Project\100add>debug dos.exe
-g

AX=FFFF  BX=0031  CX=0000  DX=0042  SP=0200  BP=0000  SI=002E  DI=0000
DS=13CD  ES=13B9  SS=13D6  CS=13C9  IP=002D   NV UP EI PL NZ NA PE NC
13C9:002D CC            INT     3
-t

AX=FFFF  BX=0031  CX=0000  DX=0042  SP=01FA  BP=0000  SI=002E  DI=0000
DS=13CD  ES=13B9  SS=13D6  CS=0DD7  IP=13B1   NV UP DI PL NZ NA PE NC
0DD7:13B1 55            PUSH    BP
-t

AX=FFFF  BX=0031  CX=0000  DX=0042  SP=01F8  BP=0000  SI=002E  DI=0000
DS=13CD  ES=13B9  SS=13D6  CS=0DD7  IP=13B2   NV UP DI PL NZ NA PE NC
0DD7:13B2 8BEC          MOV     BP,SP
-p

AX=FFFF  BX=0031  CX=0000  DX=0042  SP=01F8  BP=01F8  SI=002E  DI=0000
DS=13CD  ES=13B9  SS=13D6  CS=0DD7  IP=13B4   NV UP DI PL NZ NA PE NC
0DD7:13B4 FF8E0200      DEC     WORD PTR [BP+0002]                 SS:01FA=002E
-p

AX=FFFF  BX=0031  CX=0000  DX=0042  SP=01F8  BP=01F8  SI=002E  DI=0000
DS=13CD  ES=13B9  SS=13D6  CS=0DD7  IP=13B8   NV UP DI PL NZ NA PE NC
0DD7:13B8 5D            POP     BP
-p

AX=FFFF  BX=0031  CX=0000  DX=0042  SP=01FA  BP=0000  SI=002E  DI=0000
DS=13CD  ES=13B9  SS=13D6  CS=0DD7  IP=13B9   NV UP DI PL NZ NA PE NC
0DD7:13B9 EB21          JMP     13DC
-


偶是菜鸟 要怎样才能让程序继续运行?  先谢谢了

[[it] 本帖最后由 zklhp 于 2008-7-28 02:15 编辑 [/it]]
14 回复
#2
zklhp2008-07-07 19:59
高手一句话就说明了 是不是要清什么标志位?

指点下
#3
zklhp2008-07-12 16:43
顶到出答案为止
#4
zklhp2008-07-20 01:39
再顶  高人说下
#5
yuanlongs2008-07-20 12:53
我帮你顶
#6
zklhp2008-07-22 16:39
[bo][un]zklhp[/un] 在 2008-7-5 21:43 的发言:[/bo]

用debug调试时  遇到 int 3h 的断点后 如何使程序继续运行?

我说各位高手 是无法实现 无此功能    还是问题太弱 不屑于回答    还是大家都不知道呀 给个说法 偶在网上找了半天啥也没找到

D:\MASMPlus\Projec ...



是不是要清什么标志位?
#7
你们都要疼我哦2008-07-25 14:01
DOS下的不懂. 写成32位的,用OD调试多好.
#8
ONEPROBLEM2008-07-25 17:37
3号中断是“断点中断”啊,在使用DEBUG的时候,遇到这里当然会引发中断的(而且引发的就是断点中断处理程序)。
否则,只有修改中断向量表了。
不知道我说的对不对?

[[it] 本帖最后由 ONEPROBLEM 于 2008-7-25 17:39 编辑 [/it]]
#9
zklhp2008-07-27 15:16
[bo][un]ONEPROBLEM[/un] 在 2008-7-25 17:37 的发言:[/bo]

3号中断是“断点中断”啊,在使用DEBUG的时候,遇到这里当然会引发中断的(而且引发的就是断点中断处理程序)。
否则,只有修改中断向量表了。
不知道我说的对不对?


讲的太好了 谢谢了 论坛里真是热心人多

偶问的是 怎么让程序继续运行  就像在 win32 里那样  好象执行了 int 3h 后 那个单步的标志位会被设置上  怎么让它继续运行

好象直接用  g p t 都不行 怎么办

谢谢了
#10
ONEPROBLEM2008-07-27 23:17
哥们,你的问题是不是太复杂了?
遇到int 3h,必然要处理断点中断的。而断点,就是程序停下来的地方,为什么要停下来?是为了等待我们去处理(这个断点),我们去处理了,程序才会继续运行。
什么单步标志位?是不是要说TF 呢?在进入任何中断前,TF都要置0 。原因:1、避免单步中断的“恶性循环”(个人说法);2、禁止其它的可屏蔽中断(指外中断的)。
在遇到int 3h 的时候,不管TF是0,或是1,CPU都要把TF置0,然后强制跳转,因为3号中断是内中断,是CPU必须响应的。
所以,我的观点是:除非你能修改中断向量表(这在DOS下是允许的),让3号中断这个地方指向你的程序要继续运行的地方。

这是我的理解,可能不对。请楼主参考一下罢了。
#11
zklhp2008-07-28 02:12
[bo][un]ONEPROBLEM[/un] 在 2008-7-27 23:17 的发言:[/bo]

哥们,你的问题是不是太复杂了?
遇到int 3h,必然要处理断点中断的。而断点,就是程序停下来的地方,为什么要停下来?是为了等待我们去处理(这个断点),我们去处理了,程序才会继续运行。
什么单步标志位?是不是 ...


偶不太懂dos里的那些东西 问的问题可能有些愚蠢 还望您别笑话我  

偶在用debug调试是 有时要在一个地方停一下 看看内存 寄存器之类的东西

可我不知道怎么在debug里下断点  就直接改程序 在想断的地方加 int 3
 
在win32里 用od时 这种方法还很实用(个人意见 呵呵)

可看完后 还想继续运行程序 可用 g t p 都不能达到目的 就发了这个帖

其实 是可以的 只要用 g =**  让它在下一条指令处运行就行了

既然您对dos很了解 偶就再问深一点

在debug里 正确的 或比较好的 调试方法是什么呢  可否给个例子?

int 3h 是调试中断 有什么用处?该怎样用呢?

“在进入任何中断前,TF都要置0 。”  那在偶断下来时

AX=0000  BX=0000  CX=0014  DX=0000  SP=0200  BP=0000  SI=0006  DI=0000
DS=13DD  ES=13C7  SS=13E6  CS=13D7  IP=0012   NV UP EI PL ZR NA PE NC
13D7:0012 CC            INT     3
-g

AX=0000  BX=0000  CX=0014  DX=0000  SP=0200  BP=0000  SI=0006  DI=0000
DS=13DD  ES=13C7  SS=13E6  CS=13D7  IP=0012   NV UP EI PL ZR NA PE NC
13D7:0012 CC            INT     3
-g

AX=0000  BX=0000  CX=0014  DX=0000  SP=0200  BP=0000  SI=0006  DI=0000
DS=13DD  ES=13C7  SS=13E6  CS=13D7  IP=0012   NV UP EI PL ZR NA PE NC
13D7:0012 CC            INT     3
-g

AX=0000  BX=0000  CX=0014  DX=0000  SP=0200  BP=0000  SI=0006  DI=0000
DS=13DD  ES=13C7  SS=13E6  CS=13D7  IP=0012   NV UP EI PL ZR NA PE NC
13D7:0012 CC            INT     3
-g

AX=0000  BX=0000  CX=0014  DX=0000  SP=0200  BP=0000  SI=0006  DI=0000
DS=13DD  ES=13C7  SS=13E6  CS=13D7  IP=0012   NV UP EI PL ZR NA PE NC
13D7:0012 CC            INT     3

直接用 g 怎么不会继续运行?此处用 t p 就转到 int 3 的中断处理程序 用 g 怎么就不行呢?

“2、禁止其它的可屏蔽中断(指外中断的)。” 怎么理解呀? 这个功能好象是 IF 的呀?

IF(Interrupt Flag)中断标志,当IF为1时,允许中断,否则关闭中断
TF(Trap Flaga)陷井标志,用于单步方式操作。当TF位为1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF位为0时,CPU正常工作不产生陷阱。

如果偶真要在 debug 里设置或清除 TP  该怎么做?好象没有现成的指令

能碰到您这样的高手真是幸运呀  能者多劳嘛  还望您能给俺解惑 谢谢了

可否留个联系方式 有问题随时咨询 可以吗

btw 如果这些都说明白了   这个帖就够当个精华帖了 哈哈
#12
ONEPROBLEM2008-07-28 09:00

先声明哈:
1、我真的是一只小小的菜鸟啊;2、我对DOS了解不多;3、我们都是相互学

习的,希望共同提高哦。
回复:
1、在debug里下断点,直接 g address就可以了;address这个地方就是

你需要的断点。看完了断点,想继续运行,再g ;或希望到到下一个断点,也

是如此:g address .
2、在debug里面,较好的调试方法?请查阅《DEBUG命令参考手册》。
3、int 3h 是调试中断 有什么用处?该怎样用呢?
你自己已经回答了:"直接改程序 在想断的地方加 int 3

在win32里 用od时 这种方法还很实用(个人意见 呵呵)"
比我还懂啊
4、你总是想跳过int 3h这个中断,是吗?可是,不恢复现场行吗?即:恢

复CS、IP和标志寄存器。
5、关于TF、IF你说得很详细。禁止可屏蔽中断是IF置0,你对的 。对于IF

,有STI和CLI两条指令;对于TF,我也不知道有没有设置它的指令。TF的

置位,似乎是由硬件完成的。其实,进入int 3h中断前的中断过程也是由硬

件自动完成的,我们无法改变它,即:保存现场工作我们无从干涉。
6、方法是由人想的,既然int 3h不好控制,可以想别的办法啊。
7、在论坛里交流已经很自由很愉快了。我有QQ,但主要是为了工作。我天

天来看我的空间啊,有要相互交流的请发消息,或留言

最后声明:我很啰嗦,别见怪 ;我很菜,别过高看待 ;我爱编程,希望和所

有有共同爱好的朋友一起进步、提高 。如此而已
#13
zklhp2008-07-28 10:54
[bo][un]ONEPROBLEM[/un] 在 2008-7-28 09:00 的发言:[/bo]


先声明哈:
1、我真的是一只小小的菜鸟啊;2、我对DOS了解不多;3、我们都是相互学

习的,希望共同提高哦。
回复:
1、在debug里下断点,直接 g address就可以了;address这个地 ...


高手有时也谦虚  反正您比我水平高 呵呵

第一个debug里下断的方法以前还真不会  不过 不反汇编 怎么知道在哪里断  又不是像在od里那样 呵呵

根据实践  直接跳过 int 3h  也没什么大问题  不知道实际情况是不是这样 会不会搞乱堆栈 再研究吧 偶认为 既然  int 3h 是自己加的 应该可以跳过的

偶还是不太懂你说的那个中断处理程序之类的  到底 int 3h 的处理程序在干啥 保护现场  跳过有什么危害?

AX=0000  BX=0000  CX=0014  DX=0000  SP=0200  BP=0000  SI=0006  DI=0000
DS=13DD  ES=13C7  SS=13E6  CS=13D7  IP=0012   NV UP EI PL ZR NA PE NC
13D7:0012 CC            INT     3
-g

AX=0000  BX=0000  CX=0014  DX=0000  SP=0200  BP=0000  SI=0006  DI=0000
DS=13DD  ES=13C7  SS=13E6  CS=13D7  IP=0012   NV UP EI PL ZR NA PE NC
13D7:0012 CC            INT     3
-g

AX=0000  BX=0000  CX=0014  DX=0000  SP=0200  BP=0000  SI=0006  DI=0000
DS=13DD  ES=13C7  SS=13E6  CS=13D7  IP=0012   NV UP EI PL ZR NA PE NC
13D7:0012 CC            INT     3
-g

AX=0000  BX=0000  CX=0014  DX=0000  SP=0200  BP=0000  SI=0006  DI=0000
DS=13DD  ES=13C7  SS=13E6  CS=13D7  IP=0012   NV UP EI PL ZR NA PE NC
13D7:0012 CC            INT     3
-g

用 g 时  到底干了什么?这里也不太明白 还望指点下

你说你罗嗦  偶看是讲的详细 讲的深刻 呵呵

再次感谢  还望指教
#14
lvyanan2008-07-31 12:31
用G命令如下格式:
  G=<指令偏移>  [断点偏移1],.....[断点偏移9]
例:
  G=100 120,130,145,177
程序从100开始执行,遇到120、130、145、177处的指令时,会产生软int3断点中断,最多允许设9个断点。120、130、145、177处的断点由DEBUG软件自动设置,断点中断产生后会自动清除所设全部断点,要继续调试就需要重新设置新断点。
LZ在设置int3中断并被截获后,用单步调试命令执行,进入的是DEBUG的INT3断点中断服务程序的代码里了,这样做是不正确的。

[[it] 本帖最后由 lvyanan 于 2008-7-31 12:42 编辑 [/it]]
#15
zklhp2008-07-31 13:57
[bo][un]lvyanan[/un] 在 2008-7-31 12:31 的发言:[/bo]

用G命令如下格式:
  G=  [断点偏移1],.....[断点偏移9]
例:
  G=100 120,130,145,177
程序从100开始执行,遇到120、130、145、177处的指令时,会产生软int3断点中断,最多允许设9个断点。120、130、145、1 ...


要是直接用 g= 下一条指令   的方法直接跳过去  会有什么危险 是否影响堆栈
1