VS Code 调试工作流¶
当前仓库的 .vscode/launch.json 已经把几种最常用的调试入口准备好了。真正的关键不是记住配置名字,而是知道:我现在是在调顶层 Python,还是在调传统 C++ 入口;我想看的是单边逻辑,还是整条 Python-C++ 链。
最常用的一条:Python 调试main.py¶
这是日常开发最推荐先上的入口。它会直接启动 ZBin/PythonScripts/main.py,并把工作目录设成 ZBin/。如果你现在主要在改:
SelectPlay.pyConfig.pyPlay/*RoleMatch_LuaStyle/*
那这条通常就是第一选择。
它的最大好处是:你不需要先穿过 Client -> Medusa.exe 那条更传统的入口,就能直接在 Python 顶层主循环里打断点。对改战术、看状态机和查角色匹配来说,这会省很多时间。
想连 C++ 一起看时,用 compound¶
当前工作区已经配好一个很实用的 compound:
它的思路其实很自然:先用 Python 调试main.py 启动加载了 CppPackage.pyd 和 MedusaCore.dll 的 python.exe 进程,再用 C++ (Windows) 附加 挂到这个进程上。注意,这里附加的不是 Medusa.exe,而是那只已经把 Core 加载进来的 Python 进程。
这条工作流特别适合下面这种场景:
你想从
Play或Skill.py的高层逻辑出发,一路追到pybind_Skill.cpp、再追到真正的 C++ Skillplan()。
什么时候该回到传统 C++ 顶层¶
仓库里也保留了经典路线:
Launch C++ EXE with Python debugpyPython Attach (debugpy 5678)
这条路更适合你在下面这些情况下使用:
- 问题只会在
Medusa.exe传统入口下复现; - 你想看
Client -> Medusa.exe这条老工作流; - 你确实需要复现更接近比赛时的入口形式。
它的代价是调试动作稍多一些,因为 Python 侧需要显式打开 debugpy.listen(5678) 并等待 attach。不过仓库里已经预留了相关注释模板,所以并不是从零开始折腾。
当前文件调试 不是主线,但也很有用¶
Python 调试程序: 当前文件 这个配置很适合跑一些单独的小脚本,比如工具脚本、数据处理脚本、GUI 辅助模块或小实验。但它并不适合替代完整比赛主循环,因为它默认不会自动给你拉起整个 SystemRunner -> SelectPlay -> postDecision 这套流程。
所以更合适的用法是:把它当作“单脚本实验台”,而不是“比赛系统总入口”。
平时怎么选最省力¶
如果你现在在改战术脚本、状态机或 Skill.py 包装层,通常先选 Python 调试main.py。如果你已经知道这次排查一定会追进 C++ 底层,那就直接上 compound。只有当你明确需要复现传统入口问题时,才优先回到 Launch C++ EXE with Python debugpy。
这个顺序看起来像经验主义,但实际上很省时间。因为大部分日常问题,根本不需要先把整条老入口链都拉起来。
如果断点怎么都进不去,先别急着怀疑 VS Code¶
绝大多数所谓“调试器坏了”的问题,最后都能回到下面这几项对齐检查:
- VS Code 当前 Python 解释器是不是
ZBin/PythonScripts/.venv; - 当前工作目录是不是
ZBin; - 你现在调的是 Python 顶层模式,还是 C++ 顶层模式;
- 你附加到的进程到底是不是那只真正加载了 Core 的进程。
一个非常实用的判断
如果你走的是 Python 顶层联合调试,C++ 应该附加到 python.exe;如果你走的是传统入口联合调试,C++ 本体才会是 Medusa.exe。
只要这几件事在脑子里一直很清楚,调试这件事就不会显得神秘。