lonkiss
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2004-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1894回复:18

问个DOS下开发中断程序的问题:如何调试呢?(20分)

楼主#
更多 发布于:2002-07-19 13:07
我用Dos6.22和bc3.1for Dos开发一个Dos的设备驱动
我用SetVect()取得了某个中断的处理权。
现在的问题是:
    在我的中断函数里面不能用printf()函数来打印输出!!
    这样的话,我怎么才能跟踪我的中断函数呢?比如我想在中断里看看某个变量的值???

谁有好的解决方法?
不知道为什么用sprintf()和puts()配合也不行
我的真名就叫-龙旗
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
沙发#
发布于:2002-07-19 16:01
Softice(for DOS)
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
zjg1603
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-07-19 16:13
可以在中断中将变量的值写到文件,等中断结束再去查看文件的内容。这个方法可能比较笨,但确实有一定的效果。
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-19 16:26
用BC自带的TD调试器就很方便地可以做到。
Tom_lyd
lonkiss
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2004-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-19 17:10
谢谢了
我不想设断点来跟踪
因为我的程序跟时间很有关系
我只想把程序运行的结果和流向打印出来......
不是只有向文件输出了??
但是现在我的程序一进中断就死悄悄了,重起以后去看文件,结果文件才0个字节。
我的真名就叫-龙旗
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-19 17:48
你不能在TSR中使用动态内存有关的函数,这是非常不安全的。如果你想看执行结果的话,建议你采取写文件的方法。
既然设断点可以达到目标,你为什么不试试呢?多方便哪。
步骤如下:
1.TD yourfile.exe
2.设置断点
3.F9 resident
4.TD->File->Resident.
2,3可以颠倒。
Tom_lyd
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-07-19 18:00
偶觉得softice for dos也好用呀
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-20 01:42
偶觉得softice for dos也好用呀


!

.......

 :o
[color=red]大头鬼! :P[/color]
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-20 12:00
你需要先用softice将你的程序调通了
起码不死机了吧,
然后再考虑其他有关时间什么的要求
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
wolf
驱动牛犊
驱动牛犊
  • 注册日期2001-06-21
  • 最后登录2009-04-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-20 14:45
先把中断服务程序当作一个普通的子程序调通,
至于检查中间状态你可以把它们保存到内存中,中断完后再观察。
Wolf
fanghui
驱动牛犊
驱动牛犊
  • 注册日期2002-02-17
  • 最后登录2002-12-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-21 08:22
在DOS下中断服务要注意DOS重入问题,简单的说就是在大多数情况下(当然有“安全
期”)中断服务不能调用DOS服务(即INT 21H等),因此使用sprintf()和写文件等方
法只能导致死机,绝大多数C的运行库也不能使用;你可以试一下BIOS服务INT 10H。

advantech
驱动牛犊
驱动牛犊
  • 注册日期2002-07-03
  • 最后登录2005-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-22 15:41
可以直接写显示内存嘛
objectx
驱动牛犊
驱动牛犊
  • 注册日期2002-03-15
  • 最后登录2005-06-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-22 17:24
因为printf()本身也是通过DOS中断来实现的,所以你在中断中在使用的话,就会导致DOS重入,故而不行,可用的办法是:
你去查一下BIOS的中断,好像又向屏幕写的功能。这样就可避免
DOS重入。
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-07-23 11:56
呵呵,可以采用这个办法:

不能使用Printf(),但是,可以使用sprintf()
在驱动加载后,修改0:413处的数值,使其减少1K,这样的话,高端的1K就不会被系统覆盖,你可以把结果传送到这个地方,然后用Softice或者debug等工具查看
签名是什么?
lonkiss
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2004-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-07-24 10:42
sprintf也不行吧?我试过的。它好像也使DOS重入了。
我的真名就叫-龙旗
lonkiss
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2004-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-07-24 14:32
我还想问一下Tom_lyd:
用了TD的Resident功能后就到了DOS的提示符下,再怎样回到TD的调试环境里呢?因为我没有下断点就File->Resident了。
我的真名就叫-龙旗
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-07-24 14:42
我还想问一下Tom_lyd:
用了TD的Resident功能后就到了DOS的提示符下,再怎样回到TD的调试环境里呢?因为我没有下断点就File->Resident了。

连续Ctrl-Break两下即可,当然是在你没有截留这个中断的前提下。
Tom_lyd
lonkiss
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2004-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-07-24 14:48
谢谢了!!
但是这样回来之后,似乎TD的运行状态还是Resident呢?比如想要用Dos Shell的功能时它就报告说TD正在Resident。那么如何取消这个状态呢?
另外哪里有TD的使用说明呢?它的联机帮助好像没有介绍它自己的用法?(Td3.1)
我的真名就叫-龙旗
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-07-24 14:54
这时TD当然仍是驻留的,如果你想退出TD驻留,只要在TD被激活的时候,按下alt-X即可。
TD的使用说明现在实在难找,不过一般自己都能摸出来了:)

祝好运 !
Tom_lyd
游客

返回顶部