用于rr反向调试的MCP服务器(karellen rr-MCP)
  
](https://pypi.org/project/karellen-rr-mcp/) ](https://pypi.org/project/karellen-rr-mcp/) ](https://pypi.org/project/karellen-rr-mcp/) ](https://pypi.org/project/karellen-rr-mcp/) ](https://pypi.org/project/karellen-rr-mcp/)
概述
karellen-rr-mcp 是一个 主控程序 (模型上下文协议) 允许任何符合MCP的LLM客户端使用的服务器 rr 为了 反向调试。LLM可以迭代地添加调试输出和重建,而不是 使用rr记录失败的测试,然后通过以下方式进行完整的正向和反向调试 GDB/MI,在不修改源代码的情况下检查程序状态。
需求
- Linux 在x86-64上(rr仅支持Linux;aarch64是实验性的)
- rr 已安装并位于PATH上
- GDB 已安装并位于PATH上(rr用于调试)
- python >= 3.10
perf_event_paranoid着手1允许录制:
sudo sysctl kernel.perf_event_paranoid=1安装rr和GDB
通过pip (使用 卡雷伦):
pip install karellen-rr-mcp[rr]这将rr作为pip包与karellen rr-mcp一起安装。GDB仍必须安装 单独通过您的系统包管理器。
Fedora/RHEL/CentOS:
sudo dnf install rr gdbUbuntu/Debian:
sudo apt install rr gdbArch Linux:
sudo pacman -S rr gdb配置perf_event_paranoid
rr需要访问硬件性能计数器。集 perf_event_paranoid 到 1:
sudo sysctl kernel.perf_event_paranoid=1要使其在重新启动后持续存在,请执行以下操作:
echo 'kernel.perf_event_paranoid=1' | sudo tee /etc/sysctl.d/50-rr.conf验证设置
rr record /bin/true && echo "rr is working"如果由于权限错误而失败,请检查 perf_event_paranoid.如果里面坏了 容器或VM,请注意rr需要访问CPU性能计数器——确实如此 除非硬件PMU passthrough在大多数容器(Docker、Podman)或VM中不起作用 已配置。
安装
pip install karellen-rr-mcp或者使用pipx用于隔离环境:
pipx install karellen-rr-mcpClaude代码集成
Claude Code插件(推荐)
该插件自动配置MCP服务器,包括:
- 碰撞检测钩 当Bash命令带信号退出时,这表示rr
(SIGSEGV、SIGABRT、SIGBUS等)或输出包含崩溃/清理签名
/karellen-rr-mcp:rr-debug技能 它穿过整个
逐步记录回放分析工作流程
rr-investigator代理 克劳德可以自主地进行调查
使用rr反向执行崩溃
从 Karellen插件市场:
claude plugin marketplace add karellen/claude-plugins
claude plugin install karellen-rr-mcp@karellen-plugins或者从官方的Anthropic市场(如果接受):
claude plugin install karellen-rr-mcp@claude-plugins-official或者直接从本地收银台加载进行测试:
claude --plugin-dir /path/to/karellen-rr-mcp手动MCP服务器配置
如果您不想使用该插件,可以直接配置MCP服务器。 这为您提供了MCP工具,但没有技能、代理或碰撞检测挂钩。
使用CLI:
claude mcp add --transport stdio karellen-rr-mcp -- karellen-rr-mcp或手动添加到 ~/.claude.json (用户范围)或 .mcp.json 在项目根目录中 (项目范围,通过版本控制共享):
{
"mcpServers": {
"karellen-rr-mcp": {
"type": "stdio",
"command": "karellen-rr-mcp"
}
}
}如果与pipx一起安装:
claude mcp add --transport stdio karellen-rr-mcp -- pipx run karellen-rr-mcp或手动:
{
"mcpServers": {
"karellen-rr-mcp": {
"type": "stdio",
"command": "pipx",
"args": ["run", "karellen-rr-mcp"]
}
}
}自动批准rr工具
默认情况下,Claude Code将在每次操作之前提示确认 rr_* 工具调用。 当系统提示时,您可以通过选择“是,不再询问”来单独批准。
要预先自动批准所有工具,请在用户设置中添加权限规则 (~/.claude/settings.json):
{
"permissions": {
"allow": [
"mcp__plugin_karellen-rr-mcp_karellen-rr-mcp__*",
"mcp__karellen-rr-mcp__*"
]
}
}第一条规则涵盖插件加载工具,第二条规则涵盖手动MCP配置。
或者,对于项目范围的设置,将相同的规则添加到 .claude/settings.json 在你的 项目根目录(此文件可以提交给版本控制,以便所有团队成员都能获得它)。
可用工具
会话生命周期
| 工具 | 说明 |
|---|---|
rr_record | 用rr录制命令。返回跟踪目录路径。 |
rr_replay_start | 启动重播会话(启动rr-gdbserver+GDB/MI)。 |
rr_replay_stop | 停止当前重播会话,清理。 |
rr_list_recordings | 列出可用的rr跟踪记录。 |
rr_ps | 在跟踪记录中列出进程(PID、PPID、退出代码、命令)。 |
rr_traceinfo | 获取跟踪元数据(JSON格式的标头信息)。 |
rr_rm | 删除rr跟踪记录。 |
rr_when | 获取当前rr事件编号(跟踪中的位置)。 |
断点
| 工具 | 说明 |
|---|---|
rr_breakpoint_set | 在函数/文件:行/地址处设置断点。 |
rr_breakpoint_remove | 删除断点。 |
rr_breakpoint_list | 列出所有断点。 |
rr_watchpoint_set | 设置硬件监视点(写/读/访问)。 |
执行控制
| 工具 | 说明 |
|---|---|
rr_continue | 继续前进或后退。 |
rr_step | 进入(前进或后退)。 |
rr_next | 跨过(向前或向后)。 |
rr_finish | 运行以返回函数(如果相反,则调用site)。 |
rr_run_to_event | 跳转到特定的rr事件编号。 |
线程和帧导航
| 工具 | 说明 |
|---|---|
rr_thread_list | 列出所有线程的状态和位置。 |
rr_thread_select | 切换到其他线程。 |
rr_select_frame | 选择一个堆栈框架进行检查(局部/评估使用该框架)。 |
状态检测
| 工具 | 说明 |
|---|---|
rr_backtrace | 获取调用堆栈。 |
rr_evaluate | 在当前上下文中计算C/C++表达式。 |
rr_locals | 列出具有值的局部变量。 |
rr_read_memory | 读取原始内存字节。 |
rr_registers | 读取CPU寄存器。 |
rr_source_lines | 列出当前位置附近的源代码。 |
检查点
| 工具 | 说明 |
|---|---|
rr_checkpoint_save | 将检查点保存在当前位置。 |
rr_checkpoint_restore | 还原到已保存的检查点。 |
配置
超时
所有超时都可以通过环境变量(以秒为单位)进行配置。将它们设置在您的 MCP服务器配置:
{
"mcpServers": {
"karellen-rr-mcp": {
"type": "stdio",
"command": "karellen-rr-mcp",
"env": {
"RR_MCP_TIMEOUT_FORWARD": "300",
"RR_MCP_TIMEOUT_REVERSE": "600"
}
}
}
}| 变量 | 默认值 | 描述 |
|---|---|---|
RR_MCP_TIMEOUT_STARTUP | 30 | 等待rr-gdbserver开始监听 |
RR_MCP_TIMEOUT_CONNECT | 60 | GDB连接到rr(包括符号加载) |
RR_MCP_TIMEOUT_FORWARD | 120 | 正向执行(继续、步骤、下一步、完成) |
RR_MCP_TIMEOUT_REVERSE | 300 | 反向执行 |
RR_MCP_TIMEOUT_BREAKPOINT | 30 | 断点/观察点操作 |
RR_MCP_TIMEOUT_EVAL | 30 | 国家检查(回溯、评估、当地人等) |
对于大型二进制文件(例如MariaDB、Firefox),您可能需要增加 RR_MCP_TIMEOUT_CONNECT (符号加载可能需要20+秒)和 RR_MCP_TIMEOUT_FORWARD (回放到a 执行过程中的断点可能需要几分钟)。
故障排除
AMD Zen CPU
除非硬件SpecLockMap优化,否则rr在AMD Zen CPU上无法可靠工作 已禁用。在Zen上运行rr时,您可能会看到:
在Zen CPU上,除非禁用硬件SpecLockMap,否则rr将无法可靠工作 优化。
解决方法: 运行 zen_workaround.py 脚本来自 rr源树 根:
sudo python3 scripts/zen_workaround.py每次重新启动或挂起后都必须重新应用此修复程序。为了让它持续下去,你必须 还可以通过添加以下之一来稳定投机性存储旁路(SSB)缓解措施 以下内核命令行参数:
spec_store_bypass_disable=on--完全启用SSB缓解(具有性能
影响)
nospec_store_bypass_disable--完全禁用SSB缓解(具有安全性
影响)
或者,构建并加载 zen_workaround.ko 来自rr源代码的内核模块 树,防止SSB缓解措施在不需要的情况下重置解决方法 内核参数。
请参阅 rr-Zen维基页面 了解全部细节。
MSR内核模块未加载
这 zen_workaround.py 脚本通过以下方式访问CPU型号特定的寄存器 /dev/cpu/0/msr, 这需要 msr 内核模块。在许多发行版上,此模块未加载 默认情况下。如果脚本失败,请手动加载:
sudo modprobe msr要使其在重新启动后持续存在,请执行以下操作:
echo 'msr' | sudo tee /etc/modules-load.d/msr.conf注: 在启用了安全引导的系统上 msr 模块可能无法加载,因为 它没有签名。您可能需要在UEFI/BIOS设置中禁用安全引导, 或者使用您自己的机器所有者密钥(MOK)对模块进行签名。
使用glibc 2.42在内核6.13+上发生MADV_GUARD_INSTALL崩溃+
Linux 6.13发布 MADV_GUARD_INSTALL (madvise建议102)用于轻量级堆栈 保护页面。glibc 2.42+(例如Fedora 43)在 pthread_create.rr 5.9.0 (最新版本,从2025年2月开始)不承认这种疯狂的建议价值 并与以下设备发生碰撞:
Assertion `t->regs().syscall_result_signed() == -syscall_state.expect_errno' failed to hold.
Expected EINVAL for 'madvise' but got result 0 (errno SUCCESS); unknown madvise(102)这在rr-git-master中已修复 (提交34ff3a7,2025年8月) 但尚未包含在版本中。 您必须从源代码构建rr 得到 修复:
git clone https://github.com/rr-debugger/rr.git
cd rr
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install看 rr调试器/rr#4044 和 rr调试器/rr#3995 了解详情。
许可证
阿帕奇-2.0
