c - 调试崩溃的用 OpenWatcom 编译的 32 位 DOS 可执行文件

标签 c windows debugging dos watcom

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

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

最佳答案

请注意 DOSBox 不能完全模拟 CPU,尤其是关于 保护模式调试支持 .因此,如果要调试 DOS 保护模式可执行文件,则需要使用 VM 或其他一些模拟器。
也就是说,您可以执行以下操作。
确保您设置了这些环境变量(假设开发工具路径为 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。
    请务必指定 -d2编译器标志 ( wcc386 ) 和 debug all对于链接器( wlink )。
    示例生成文件:
    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你应该在这个屏幕上:
    enter image description here
    从这里您可以交互式地调试您的程序,就像使用现代调试器一样。
    作为旁注:
  • 引用文档,虽然我只安装了DOS工具,但是非常准确完整
  • 请注意,知道错误指令的地址与知道该指令为什么会导致程序崩溃是不一样的,这就是我邀请您使用(可能是暂时的)DOS/4G 和 Watcom Debugger 的原因。
  • 关于c - 调试崩溃的用 OpenWatcom 编译的 32 位 DOS 可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45568103/

    相关文章:

    c++ - 如何更改 Qt 中的工具包以针对 x86 机器?

    c - 开始使用支持 UNICODE 的 WINAPI 编程

    visual-studio - 使用不是与二进制文件同时生成的 pdb 文件进行调试。是否可以?

    检查指针是否分配内存

    java - 不同语言的相同算法的不同输出

    c++ - 是否有一个 lib(跨平台)来处理操作系统日期?

    c# - .NET 中包含单个整数属性的简单类的大小

    c - Scanf 在 C 中跳过每隔一个 while 循环

    windows - 通过组策略添加管理员

    c - 使用 malloc 声明变量如何导致丢失位?