标题:问个debug调试的问题(问题部分解决 万分感谢高人ONEPROBLEM)
只看楼主
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
[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 如果这些都说明白了   这个帖就够当个精华帖了 哈哈
2008-07-28 02:12
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
得分:0 

先声明哈:
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,但主要是为了工作。我天

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

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

有有共同爱好的朋友一起进步、提高 。如此而已
2008-07-28 09:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
[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 时  到底干了什么?这里也不太明白 还望指点下

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

再次感谢  还望指教
2008-07-28 10:54
lvyanan
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-7-31
得分:0 
用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]]
2008-07-31 12:31
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
[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= 下一条指令   的方法直接跳过去  会有什么危险 是否影响堆栈
2008-07-31 13:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-222766-1-1.html




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

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