请注意,DOSBox 并未完全模拟 CPU,尤其是在保护模式调试支持方面。所以如果你想调试一个 DOS 保护模式的可执行文件,你需要使用虚拟机或其他一些模拟器。
也就是说,您可以执行以下操作。
确保您设置了这些环境变量(假设开发工具路径为C:\WATCOM):
SET PATH=C:\WATCOM\BINW;%PATH%
SET INCLUDE=C:\WATCOM\H
SET WATCOM=C:\WATCOM
SET EDPATH=C:\WATCOM\EDDAT
SET WD=/TR#RSI/SWAP
WD 是为 DOS Watcom 调试器指定默认选项的那个:
-
/TR#RSI 标志指定可执行文件使用 DOS/4G DOS 扩展程序
-
/SWAP 指定视频内存交换使用单个页面完成,如果您正在开发图形应用程序,这是强制性的。
据我所知WD 不支持 DOS32/A DOS 扩展器,所以你可以决定使用 DOS/4G。
请务必为编译器 (wcc386) 指定 -d2 标志,为链接器 (wlink) 指定 debug all。
示例生成文件:
LINK_FLAGS_DBG = debug all SYS dos4g op m op maxe=25 op q op symf
CC = wcc386
CC_FLAGS_DBG = -i=C:\WATCOM\H -w4 -e25 -zq -otexan -d2 -5s -bt=dos -mf
OBJS = test.obj
test.exe : $(OBJS) test.lnk
wlink $(LINK_FLAGS_DBG) @$^*
test.lnk : $(OBJS)
echo NAME $^& >$^@
echo DEBUG all >>>>$^@
for %i in ($(OBJS)) do echo FILE %i >>$^@
clean :
del *.obj
del *.exe
del *.lnk
del *.map
del *.sym
.c.obj : .AUTODEPEND
$(CC) $[* $(CC_FLAGS_DBG)
test.c 文件:
#include <stdio.h>
void main(int argc, char *argv[]) {
int test = 1234;
printf("Hello world!\ntest is %d", test);
}
使用以下命令构建可执行文件(以及符号和映射文件):
wmake
使用以下命令启动 Watcom DOS 调试器:
wd test
你应该在这个屏幕上:
您可以在此处以交互方式调试程序,就像使用现代调试器一样。
附注:
- 参考文档,虽然我只安装了DOS工具,但是非常准确和完整
- 请注意,知道错误指令的地址并不等于知道该指令导致程序崩溃的原因,这就是我邀请您使用(可能是暂时的)DOS/4G 和 Watcom 调试器的原因。