Отладка сбоя 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.