在MS-DOS中调试以下com文件时,我可以使用-g成功运行该程序,并且该程序正常终止,但是当我跟踪它时,该程序将引发非法操作异常,并在+/- 800条指令后终止。我手动跟踪了该文件,但看不到为什么中止(它确实将一些数据写入较低的内存区域,但这不应影响调试器)。

可以找到COM文件

MS Debug和Freedos -t 1000都给出相同的结果(尽管它们在执行的不同点崩溃)。 WinXP虚拟x86环境和dosbox都给出相同的结果。

是否有这样的想法令人高兴? pastebin。

此跟踪是通过使用这些软件运行FreeDOS调试器的Dosbox进行的。用于单步跟踪。还请注意所有寄存器和标志都被弄乱了。

评论

粘贴跟踪日志。

看到调试器崩溃的错误取决于调试器(执行期间在不同点崩溃),最可能的解释是调试器的某些部分被覆盖。但是,我究竟该如何检验该假设呢?我不能将任何页面保护或任何内容置于实模式。

#1 楼

这些指令:

6401.AX=0000 BX=0811 CX=0004 DX=0000 SP=FFF8 BP=0000 SI=8020 DI=8000
6402.DS=F800 ES=F800 SS=06F1 CS=0811 IP=051F NV UP EI PL ZR NA PE NC
6403.0811:051F F3AB              REP     STOSW
6404.AX=0000 BX=0811 CX=0003 DX=0000 SP=FFF8 BP=0000 SI=8020 DI=8002
6405.DS=F800 ES=F800 SS=06F1 CS=0811 IP=051F NV UP EI PL ZR NA PE NC
6406.0811:051F F3AB              REP     STOSW
6407.AX=0000 BX=0811 CX=0002 DX=0000 SP=FFF8 BP=0000 SI=8020 DI=8004
6408.DS=F800 ES=F800 SS=06F1 CS=0811 IP=051F NV UP EI PL ZR NA PE NC
6409.0811:051F F3AB              REP     STOSW


正在覆盖中断表-特别是中断0并打算写入中断1。Trace使用中断1,因此正在中断该写入。在最后一个REP完成之后发生的下一条跟踪指令将使用部分覆盖的新地址(而不是调试器的地址)触发中断。
此时的效果是完全不可预测的。
您无法跟踪这个自动。您需要进行一些交互。