阅读:1973回复:18
问个DOS下开发中断程序的问题:如何调试呢?(20分)
我用Dos6.22和bc3.1for Dos开发一个Dos的设备驱动
我用SetVect()取得了某个中断的处理权。 现在的问题是: 在我的中断函数里面不能用printf()函数来打印输出!! 这样的话,我怎么才能跟踪我的中断函数呢?比如我想在中断里看看某个变量的值??? 谁有好的解决方法? 不知道为什么用sprintf()和puts()配合也不行 |
|
|
沙发#
发布于:2002-07-19 16:01
Softice(for DOS)
|
|
|
板凳#
发布于:2002-07-19 16:13
可以在中断中将变量的值写到文件,等中断结束再去查看文件的内容。这个方法可能比较笨,但确实有一定的效果。
|
|
地板#
发布于:2002-07-19 16:26
用BC自带的TD调试器就很方便地可以做到。
|
|
|
地下室#
发布于:2002-07-19 17:10
谢谢了
我不想设断点来跟踪 因为我的程序跟时间很有关系 我只想把程序运行的结果和流向打印出来...... 不是只有向文件输出了?? 但是现在我的程序一进中断就死悄悄了,重起以后去看文件,结果文件才0个字节。 |
|
|
5楼#
发布于:2002-07-19 17:48
你不能在TSR中使用动态内存有关的函数,这是非常不安全的。如果你想看执行结果的话,建议你采取写文件的方法。
既然设断点可以达到目标,你为什么不试试呢?多方便哪。 步骤如下: 1.TD yourfile.exe 2.设置断点 3.F9 resident 4.TD->File->Resident. 2,3可以颠倒。 |
|
|
6楼#
发布于:2002-07-19 18:00
偶觉得softice for dos也好用呀
|
|
7楼#
发布于:2002-07-20 01:42
偶觉得softice for dos也好用呀 ! ....... :o |
|
|
8楼#
发布于:2002-07-20 12:00
你需要先用softice将你的程序调通了
起码不死机了吧, 然后再考虑其他有关时间什么的要求 |
|
|
9楼#
发布于:2002-07-20 14:45
先把中断服务程序当作一个普通的子程序调通,
至于检查中间状态你可以把它们保存到内存中,中断完后再观察。 |
|
|
10楼#
发布于:2002-07-21 08:22
在DOS下中断服务要注意DOS重入问题,简单的说就是在大多数情况下(当然有“安全
期”)中断服务不能调用DOS服务(即INT 21H等),因此使用sprintf()和写文件等方 法只能导致死机,绝大多数C的运行库也不能使用;你可以试一下BIOS服务INT 10H。 |
|
11楼#
发布于:2002-07-22 15:41
可以直接写显示内存嘛
|
|
12楼#
发布于:2002-07-22 17:24
因为printf()本身也是通过DOS中断来实现的,所以你在中断中在使用的话,就会导致DOS重入,故而不行,可用的办法是:
你去查一下BIOS的中断,好像又向屏幕写的功能。这样就可避免 DOS重入。 |
|
13楼#
发布于:2002-07-23 11:56
呵呵,可以采用这个办法:
不能使用Printf(),但是,可以使用sprintf() 在驱动加载后,修改0:413处的数值,使其减少1K,这样的话,高端的1K就不会被系统覆盖,你可以把结果传送到这个地方,然后用Softice或者debug等工具查看 |
|
|
14楼#
发布于:2002-07-24 10:42
sprintf也不行吧?我试过的。它好像也使DOS重入了。
|
|
|
15楼#
发布于:2002-07-24 14:32
我还想问一下Tom_lyd:
用了TD的Resident功能后就到了DOS的提示符下,再怎样回到TD的调试环境里呢?因为我没有下断点就File->Resident了。 |
|
|
16楼#
发布于:2002-07-24 14:42
我还想问一下Tom_lyd: 连续Ctrl-Break两下即可,当然是在你没有截留这个中断的前提下。 |
|
|
17楼#
发布于:2002-07-24 14:48
谢谢了!!
但是这样回来之后,似乎TD的运行状态还是Resident呢?比如想要用Dos Shell的功能时它就报告说TD正在Resident。那么如何取消这个状态呢? 另外哪里有TD的使用说明呢?它的联机帮助好像没有介绍它自己的用法?(Td3.1) |
|
|
18楼#
发布于:2002-07-24 14:54
这时TD当然仍是驻留的,如果你想退出TD驻留,只要在TD被激活的时候,按下alt-X即可。
TD的使用说明现在实在难找,不过一般自己都能摸出来了:) 祝好运 ! |
|
|