Завершать DAP при потере остановленного MAME

This commit is contained in:
Александр Петров
2026-09-16 15:12:42 +03:00
parent d25f28e1cd
commit 0a71f94240
8 changed files with 137 additions and 37 deletions
+38 -24
View File
@@ -1,6 +1,6 @@
# Отладка исходников: реализация и результаты
Дата: 2026-09-15. План: [mame-source-debug.md](mame-source-debug.md).
Дата: 2026-09-16. План: [mame-source-debug.md](mame-source-debug.md).
Реализованы сборка/карта, проверенный транспорт, базовая C-сессия,
постоянный session server, DAP MVP, VS Code launch и build task. MCP C-уровня,
безопасный restart и расширенная отладка ещё не готовы.
@@ -65,6 +65,11 @@
логические группы и события. `set_source_breakpoints` и
`set_function_breakpoints` создают новый disabled-набор, при ошибке удаляют
его, затем заменяют прежний набор и активируют точки.
- Session server проверяет `snapshot` и при остановленном CPU раз в 0,5 с:
reset/state load инвалидирует сессию, потеря MAME приводит к закрытию после
ограниченного timeout backend. Если выполнение продолжено из родного окна
debugger MAME, server сообщает DAP смену состояния. Закрытая сессия всегда
выдаёт DAP `terminated`, даже если событие `invalidated` выпало из журнала.
- DAP MVP и минимальное VS Code-расширение: attach к session server,
source/function breakpoints, один достоверный frame, registers,
поддержанные globals/statics, evaluate одного имени, continue/pause и
@@ -80,8 +85,9 @@
для приложений с `app.mk`, команду Build Active Project и автоматическую
debug-сборку перед F5. Она использует `make SRC_DEBUG=1` и local Python 3.12;
ошибки SDCC с файлом/строкой попадают в Problems. Код сборки проверяется
самим расширением: при ошибке MAME не запускается. Run-команда, расширенные
linker/assembler diagnostics, выбор profile/EXTRA_DATA и VSIX остаются
самим расширением: при ошибке MAME не запускается. VSIX 0.2.0 собран и
проверен в отдельном workspace SprPoP. Run-команда, расширенные
linker/assembler diagnostics и выбор profile/EXTRA_DATA остаются
следующими шагами.
- DAP `logMessage` без пересборки: разрешены литералы, `{{`/`}}` и только
подстановки `{variable}`. Session server читает типизированное значение,
@@ -149,9 +155,8 @@ pyenv exec python toolchain/sdbg_session.py \
Доступны `where`, `step`, `continue`, `break-line`, `break-function`,
`read-variable`, `activate-breakpoints` и `deactivate-breakpoints`.
Это диагностический однооперационный CLI: логические ID групп точек живут
только внутри процесса. Постоянное владение и DAP добавятся в общем session
server; до него для долгой ручной работы нужен один Python-процесс с
`DebugSession`.
только внутри процесса. Для долгой работы и DAP используйте общий session
server ниже.
Предпочтительный режим для нескольких клиентов — один server:
@@ -165,7 +170,7 @@ pyenv exec python toolchain/sdbg_client.py \
--socket /tmp/sprinter-sdbg.sock status
```
VS Code-расширение находится в `toolchain/vscode-sprinter-debug/`. В
VS Code-расширение находится в отдельном репозитории `../VSCode-Sprinter`. В
Extension Development Host используется attach-конфигурация:
```json
@@ -177,9 +182,10 @@ Extension Development Host используется attach-конфигурац
}
```
В VS Code расширение `0.2.0` запускает адаптер через абсолютный путь к local
pyenv shim `~/.pyenv/shims/python` и задаёт корень workspace как `cwd`.
Это устраняет зависимость от `PATH` процесса VS Code, открытого из Dock.
В VS Code расширение `0.2.0` находит SDK через `sprinterDebugger.sdkRoot`,
а Python 3.12 — через local pyenv shim или установленную pyenv-версию.
Это устраняет зависимость от `PATH` процесса VS Code, открытого из Dock,
и позволяет отлаживать приложение из отдельного workspace.
Выбранные пути видны в Output → `Sprinter MAME Debug`; при раннем сбое
launcher сообщает stderr и последние строки MAME log.
Интегрированный запуск:
@@ -213,6 +219,7 @@ pyenv exec python tests/sdbg/run_mame_probe.py --banked --launcher --native-debu
pyenv exec python tests/sdbg/run_mame_probe.py --banked --launcher --source-step
pyenv exec python tests/sdbg/run_mame_probe.py --banked --launcher --step-out
pyenv exec python tests/sdbg/run_vscode_dap_probe.py
pyenv exec python tests/sdbg/run_vscode_dap_probe.py --exit-while-stopped
pyenv exec python tests/sdbg/run_vscode_dap_probe.py --waitkey --manual-key
```
@@ -256,8 +263,16 @@ commit `b0c4527c2edb1ee177fd09b3c412b65b385bf35b`:
| Ошибочная debug-сборка, 2026-09-15 | Изолированный `fault.c` вернул код 2 от make, `file:1: error 20` сохранился, Python traceback удалён; MAME не участвует |
| Владение и generation | Второй FileBridge и чтение со stale generation отклоняются |
Полный host-набор: 29 тестов прошли, один Unix-socket тест пропущен только
из-за запрета `bind` в sandbox. Тот же socket path проверен живым DAP-запуском.
Полный host-набор: 39 тестов (38 прошли, один Unix-socket тест пропущен только
из-за запрета `bind` в sandbox). Тот же socket path проверен живым DAP-запуском.
После разделения репозиториев установленный VSIX в изолированном профиле
VS Code запустил сборку SprPoP и остановился в `src/sprpop.c:264` (`main`)
через API extension host. Новый живой пробник закрытия собственного MAME
при остановке в `hello/main` подтверждает DAP `terminated` после внезапной
потери процесса. Штатный DAP launch в `hello/main` также повторно прошёл
с `sdbg` и опциональным `osx` debugger provider.
Graceful-закрытие MAME при остановленном CPU и state load пока не прошли
отдельный живой тест.
Это репро доступности механизма, а не полный benchmark или проверка всех
runtime/mapping/lifecycle. Отдельная публикация debug-библиотек требует
@@ -280,9 +295,8 @@ runtime/mapping/lifecycle. Отдельная публикация debug-биб
подтвердил, что при остановке в `main` окно снова открывается через
Cmd-Tab/Dock. Регрессионный DAP-проход через `getchar()` с клавишей `x`
также завершился на следующей строке с кодом `0x78`.
Воспроизводимый patch и идемпотентный установщик находятся в
`toolchain/mame-patches/` и `toolchain/apply-mame-sdbg-patch.sh`;
`make mame-sdbg` собирает и устанавливает бинарник. Provider `osx` остаётся
Воспроизводимый patch, установщик и сборочные рецепты находятся в отдельном
`../MAME/scripts/sprinter/`. Provider `osx` остаётся
доступной launch-опцией и проверен одновременно с DAP. Для непатченного MAME
можно использовать `auto`: штатные варианты — `osx` на macOS, `windows` в
native Windows build, `qt` или `imgui` в Linux. `qt` зависит от
@@ -299,12 +313,12 @@ host-моста пока не готова: FileBridge использует `fcn
## Размерный регресс и оставшаяся работа
`make size-check` запущен: сообщает рост у 12 программ относительно текущего
эталона, отсутствующие и новые сборки. В списке роста нет пересобранного
hello. Дополнительно cat и hello собраны исходной обёрткой из HEAD и новой
на тех же runtime/библиотеках: EXE попарно идентичны. Эталон не изменялся.
Этот общий check пока не считается прошедшим; расхождение существующих
сборок с baseline отделено от побайтовых регрессий новой debug-сборки.
`make size-check` теперь проходит (46 свежих карт). Прежние 12 расхождений
разобраны: `open()` добавил 9 байт после исправления режимов DSS;
`openenv` содержит ещё новый регрессионный тест; прежний размер `w3bgfx`
был снят по несвежей карте. Подробное сравнение с исходной ревизией и
правила обновления эталона — в
[плане разделения](project-reorganization.md).
Hard reset из RPC был удалён после воспроизводимого падения MAME 0.287:
старый Lua periodic callback обращался к `debugger_manager` во время нового
@@ -316,9 +330,9 @@ Crash reports в 19:22/19:23 относились к неподдержанно
строит проверенное условие через I/O port. После штатных прогонов в 20:43 и
позже новых `mame.arm-*.ips` не появилось.
Далее по плану: завершить инвалидацию на exit/state load, MCP-адаптер,
безопасный restart, расширенные выражения
и упаковку VS Code-расширения. Для IDE ещё нужны Run-команда, выбор профиля
Далее по плану: проверить graceful exit/state load живым репро, сделать
MCP-адаптер, безопасный restart и расширенные выражения. VSIX уже упакован;
для IDE ещё нужны Run-команда, выбор профиля
сборки/данных и расширенная диагностика assembler/linker.
Базовый attach уже проверяет принадлежность resident/current-bank к build,
но не умеет читать неотображённую physical RAM. Нет автоматического чтения
+5
View File
@@ -678,6 +678,11 @@ stepIn. Версионировать мост/патчи и установщик
exit/reset/reload инвалидируют состояние; потеря клиента не блокирует MAME,
конкурентные операции не читают смешанный snapshot.
Текущая реализация опрашивает backend и при остановленном CPU: потеря MAME
переводит DAP в `terminated` (проверено живым пробником с внезапным выходом).
Reset/state load обработаны notifier плагина, инвалидация проверена host-тестом;
штатное закрытие MAME и загрузка state требуют отдельных живых проверок.
### Этап 3 — полезная CLI/MCP-отладка и логи
Внешние точки/условия/логи, диспетчер совпадений, базовые типы, чтение/запись
+6
View File
@@ -99,6 +99,12 @@ service-точка `main` и вводится `a:\\HELLO.EXE`. После сов
а VS Code показывает остановку на entry. Завершение debug session останавливает
только созданные ей MAME/server.
При reset/state load или потере MAME остановленная сессия становится
недействительной и DAP завершает её; для новой отладки запускайте F5 заново.
Проверен сценарий внезапного завершения собственного MAME во время остановки
в `main`. Отдельный живой тест штатного закрытия окна и загрузки state ещё
предстоит выполнить.
`dssTimeout` задаёт предельное время ожидания prompt (30 эмулируемых секунд).
`launchAt` можно задать как необязательную нижнюю границу времени запуска;
наличие prompt всё равно обязательно. Перед вводом сохраняется диагностический