【问题标题】:Debugging crashed 32-bit DOS executable compiled with OpenWatcom调试使用 OpenWatcom 编译的崩溃的 32 位 DOS 可执行文件
【发布时间】:2018-01-16 00:15:33
【问题描述】:

我有一个应用程序,我使用 OpenWatcom 经典版(1.9 - 最新稳定版本)为 32 位 DOS/DPMI 目标(带有 DOS32/A 扩展器)编译。如果程序因错误的内存访问而崩溃,我会得到错误指令的 CS:EIP。如何将其映射到汇编代码/源代码行号? (注:我在Wine下使用的是Windows版本的OpenWatcom(在Linux中运行),然后在DosBox中运行可执行文件。)

使用 GCC/binutils,我将使用 -ggdb 进行编译,然后在可执行文件上使用 objdump -DS 来获取程序集和源代码视图。任何 OpenWatcom 等价物?或者,也许,一个可以做同样事情的交互式调试器?我尝试使用 wdis,但这仅适用于目标文件,不适用于可执行文件。由于使用目标文件我无法确定它将被重新定位到哪里,所以它是无用的。或者至少有一种方法可以为可执行文件生成符号映射?

【问题讨论】:

  • 您是否尝试过使用 OpenWatcom 自己的调试器 wd

标签: c windows debugging dos watcom


【解决方案1】:

请注意,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 调试器的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2015-04-04
    • 2020-03-30
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    相关资源
    最近更新 更多