-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完成之后发生的下一条跟踪指令将使用部分覆盖的新地址(而不是调试器的地址)触发中断。
此时的效果是完全不可预测的。
您无法跟踪这个自动。您需要进行一些交互。
评论
粘贴跟踪日志。看到调试器崩溃的错误取决于调试器(执行期间在不同点崩溃),最可能的解释是调试器的某些部分被覆盖。但是,我究竟该如何检验该假设呢?我不能将任何页面保护或任何内容置于实模式。