Отладка сбоя 32-битного исполняемого файла DOS, скомпилированного с OpenWatcom

У меня есть приложение, которое я компилирую для 32-битной цели DOS/DPMI (с расширителем DOS32/A), используя OpenWatcom classic (1.9 - последняя стабильная версия). Если программа падает при плохом доступе к памяти, я получаю CS:EIP с ошибочной инструкцией. Как я могу сопоставить это с кодом сборки / номером исходной строки? (Примечание: я использую версию OpenWatcom для Windows под Wine (работает в Linux), а затем запускаю исполняемый файл в DosBox.)

С GCC/binutils я скомпилировал бы с -ggdb, а затем использовал objdump -DS в исполняемом файле, чтобы получить и сборку, и исходный вид. Любой эквивалент OpenWatcom? Или, может быть, интерактивный отладчик, который может сделать то же самое? Я пытался использовать wdis, но это работает только с объектными файлами, а не с исполняемыми файлами. Поскольку с объектным файлом я не могу сказать, куда он будет перемещен, это бесполезно. Или, может быть, есть хотя бы способ создать карту символов для исполняемого файла?

1 ответ

Обратите внимание, что DOSBox не полностью эмулирует ЦП, особенно в отношении поддержки отладки в защищенном режиме . Поэтому, если вы хотите отлаживать исполняемый файл в защищенном режиме 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

тот, который определяет параметры по умолчанию для DOS Watcom Debugger:

  • в /TR#RSI флаг указывает, что исполняемый файл использует расширитель DOS / 4G DOS
  • /SWAP указывает, что подкачка видеопамяти выполняется с использованием одной страницы, это обязательно, если вы разрабатываете графическое приложение.

Насколько мне известно WD не поддерживает расширитель DOS32 / A DOS, поэтому вы можете решить использовать DOS / 4G.

Обязательно укажите -d2 флаг для компилятора ( wcc386) а также debug all для компоновщика ( wlink).

Пример make-файла:

      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 Debugger.
Другие вопросы по тегам