Windows调试服务

一个通过CDB(Console Debugger)为AI代理提供原生Windows调试功能的MCP服务器,支持实时断点设置、内存检查和代码步进,无需重新编译。

  • by RandyGaul
  • Python
  • 本地部署
  • 6 星标
  • 更新于
在 GitHub 查看 RandyGaul/mcp-win-debugger

使用说明

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中的方式相同,但不需要手动单击。

快速开始

先决条件

没有第三方依赖关系——服务器只使用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/ 并调查玩家健康状况变差的原因”

代理人将:

  1. 在调试器下启动可执行文件
  2. 仅加载您的符号(快速-跳过所有依赖PDB)
  3. 在相关函数上设置断点
  4. 运行程序,检查断点处的状态
  5. 跟随指针链,读取结构体,检查数组边界
  6. 找出根本原因

工具(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进程

许可证

这是免费且无阻碍的软件,已发布到公共领域。 看 未授权 了解详情。