mcp-win调试器
一个MCP服务器,通过CDB(控制台调试器)为AI代理提供本机Windows调试能力。
问题
本机代码的默认调试循环非常缓慢:
add print statement → recompile → relaunch → reproduce bug → close app → read logs → repeat每次迭代需要几分钟。对于大型C++项目,一次重新编译可能需要10多分钟。
解决方案
此MCP服务器允许AI代理 直接调试您的流程 --设置断点、检查内存、读取变量、遍历代码,甚至在运行时修改状态。无需重新编译。
attach to process → set breakpoint → inspect callstack → read locals → follow pointers → find bug每次操作都需要 毫秒。代理程序会像在Visual Studio中一样导航程序的实时状态,但由AI驱动,AI可以将源代码与它在内存中看到的内容进行交叉引用。
示例:代理发现一个Off By One Bug
考虑一下这段带有微妙错误的C代码-- get_last_player 回报 &players[count] 而不是 &players[count-1]:
typedef struct {
Player* players;
int count;
int capacity;
} GameState;
// BUG: off-by-one — accesses players[count] instead of players[count-1]
Player* get_last_player(GameState* game) {
return &game->players[game->count]; // should be count - 1
}
void apply_poison(GameState* game) {
Player* last = get_last_player(game); // reads garbage when count == 0
damage_player(last, 5);
}代理启动程序,设置断点,并调查:
| # | 代理操作 | MCP工具 | 代理看到的内容 | 结论 |
|---|---|---|---|---|
| 1 | 使用符号启动 | launch | 进程在0.25秒内启动 | 准备调试 |
| 2 | 仅加载我们的PDB | load_symbols_for | crashme!main, crashme!get_last_player 找到 | 符号加载时间为0.01秒 |
| 3 | 可疑功能中断 | set_breakpoint | bp crashme!get_last_player --已解决 | 断点集 |
| 4 | 运行程序 | go | 断点立即命中 | 从调用 main+0x8b |
| 5、这是谁说的? | callstack | get_last_player ← main ← __scrt_common_main_seh | 来自主电话的正常呼叫 | |
| 6 | 游戏状态如何? | display_type | count: 3, capacity: 4, players: 0x1d7... | 有3名玩家,看起来还可以 |
| 7 | 它返回什么? | step_out + locals | last = 0x00000000'00000000 (NULL!) | 返回错误指针! |
| 8 | 继续拨打第二个电话 | go | 击中BP apply_poison | 第二呼叫站点 |
| 9 | 进入,检查 | step_into + evaluate | game->count = 0 | 漏洞: &players[0] 空游戏=未初始化内存 |
在约1秒的调试时间内找到根本原因。 无打印声明。无需重新编译。代理读取源代码,设置目标断点,并跟踪数据直到出现错误——与Visual Studio中的方式相同,但不需要手动单击。
快速开始
先决条件
- 视窗 和 Windows SDK调试工具 已安装(提供
cdb.exe) - Python 3.12+
没有第三方依赖关系——服务器只使用Python标准库。
安装
git clone https://github.com/RandyGaul/mcp-win-debugger.git配置Claude代码
添加到您的项目 .mcp.json (如果它不存在,请在项目根目录中创建它):
{
"mcpServers": {
"windbg": {
"command": "python",
"args": ["C:/path/to/mcp-win-debugger/src/server.py"]
}
}
}替换 C:/path/to/mcp-win-debugger 使用克隆仓库的实际路径。
用法
告诉Claude调试你的程序:
“发射D:/build/myapp.exe符号来自D:/build/并调查玩家健康状况变差的原因”
代理人将:
- 在调试器下启动可执行文件
- 仅加载您的符号(快速-跳过所有依赖PDB)
- 在相关函数上设置断点
- 运行程序,检查断点处的状态
- 跟随指针链,读取结构体,检查数组边界
- 找出根本原因
工具(39)
会话管理
| 工具 | 说明 |
|---|---|
launch | 在调试器下启动可执行文件 |
attach | 通过PID附加到正在运行的进程 |
open_dump | 打开碰撞转储(.dmp)进行尸检分析 |
detach | 结束调试会话 |
执行控制
| 工具 | 说明 |
|---|---|
go | 继续执行(F5) |
step_into | 进入下一个指令(F11) |
step_over | 跳过下一条指令(F10) |
step_out | 退出当前功能(Shift+F11) |
break_execution | 进入正在运行的进程(Ctrl+Break) |
断点
| 工具 | 说明 |
|---|---|
set_breakpoint | 在函数或地址上设置代码断点 |
set_data_breakpoint | 在内存地址上设置硬件监视点 |
list_breakpoints | 列出所有断点 |
delete_breakpoint | 按ID删除断点 |
enable_breakpoint | 启用已禁用的断点 |
disable_breakpoint | 禁用而不删除 |
检查
| 工具 | 说明 |
|---|---|
callstack | 获取调用堆栈(当前线程或所有线程) |
locals | 显示当前作用域中的局部变量 |
evaluate | 计算C++表达式 |
display_type | 显示结构/类布局或实例 |
display_type_recursive | 递归展开嵌套结构 |
read_memory | 读取原始内存(字节、字、qwords、ascii) |
dereference_pointer | 跟随指针并显示目标 |
inspect_object | 显示C++对象的vtable+字段 |
修改
| 工具 | 说明 |
|---|---|
write_memory | 将值写入内存 |
set_variable | 设置局部或全局变量 |
set_register | 设置CPU寄存器 |
导航
| 工具 | 说明 |
|---|---|
threads | 列出所有线程 |
switch_thread | 切换到其他线程 |
switch_frame | 切换到其他堆栈帧 |
符号
| 工具 | 说明 |
|---|---|
modules | 列出已加载的模块 |
set_symbol_path | 设置符号搜索路径(带可选缓存) |
reload_symbols | 强制重新加载符号 |
load_symbols_for | 加载一个特定模块的符号(快速) |
search_symbol | 按通配符模式搜索符号 |
noisy_symbol_loading | 切换详细符号诊断 |
分析
| 工具 | 说明 |
|---|---|
analyze_crash | 快跑 !analyze -v 自动碰撞分析 |
exception_record | 显示当前异常详细信息 |
set_exception_filter | 配置哪些异常中断,哪些异常被忽略 |
逃生舱口
| 工具 | 说明 |
|---|---|
cdb_command | 运行任何原始的CDB/Winkey命令 |
指导工作流程(MCP提示)
该服务器包括三个代理可以遵循的指导工作流:
live_debug--对实时流程的逐步调查crash_triage--系统性碰撞倾倒分析memory_corruption--使用数据断点查找内存损坏
演出
服务器针对速度进行了优化:
- 默认情况下没有符号 --空的
-y ""防止符号服务器查找缓慢 -snul--禁用不合格符号加载(大型项目的大幅加速).symopt+0x100—SYMOPT_NO_UNQUALIFIED_LOADS运行时- 抑制异常噪声 —
sxd *; sxe av; sxi eh; sxi ch(仅访问违规中断) - 选择性符号加载 —
load_symbols_for('mymodule')加载一个PDB,而不是全部
| 操作 | 时间 |
|---|---|
| 启动小二进制 | ~0.3s |
| 加载一个模块的符号 | ~0.01秒 |
| 呼叫堆栈 | \<1ms |
| 跨步 | \<1ms |
| 读取内存 | \<1ms |
| 计算表达式 | \<1ms |
建筑测试夹具
cd tests/fixtures
cmake -B build
cmake --build build运行测试
pytest tests/ -v每个模块的测试共享一个CDB会话以提高速度(总共约2.5分钟)。
建筑
Claude Code ←→ MCP (stdio/JSON-RPC) ←→ Python server ←→ cdb.exe (subprocess)
↕
background reader thread
(readline from stdout pipe)
↕
echo marker detection
(deterministic command completion)服务器管理 cdb.exe 作为具有以下功能的子流程:
- 背景阅读器线程 --逐行读取stdout(避免Windows管道缓冲死锁)
- 回声标记协议 --发送
.echo __MARKER__在每次命令后进行可靠的完成检测 - 铝土矿清理 --在服务器退出时杀死孤立的cdb进程
许可证
这是免费且无阻碍的软件,已发布到公共领域。 看 未授权 了解详情。
