摘要本文解读 FSE 2025 论文《ChatDBG: Augmenting Debugging with Large Language Models》。该论文提出ChatDBG——一个把大语言模型接进 GDB、LLDB 与 Pdb 的 AI 调试助手通过融合增强栈轨迹Enriched Stack Trace、接管方向盘take the wheel的 function call 智能体机制与代码导航扩展命令让模型自己决定下一步该看什么从而回答程序员关于程序状态的任意自然语言提问其特别之处在于把运行时状态与调试器的控制权一起交给 LLM因此既不需要失败的测试用例也不需要预先知道缺陷位置。实验表明一次针对性提问即有 67% 的概率给出可执行的修复追加一轮追问可达 85%在 C/C 上另有 36% 命中根因、55% 命中近因这套范式把谁来推理从人转移给了模型为 LLM 时代的程序调试与自动修复提供了重要借鉴。视频讲解点击观看 B 站视频摘要论文基本信息背景与动机研究主线从问题到结论基准/方法设计分类全景方法细节实验设计与结果结果对比总结关键发现局限性常见问题FAQChatDBG 和把报错粘贴到 ChatGPT 有什么区别为什么不用 RAG 把代码和状态检索进提示ChatDBG 需要额外的模型训练吗它支持哪些语言和调试场景论文的写作有哪些可借鉴之处参考链接论文基本信息项目内容标题英文ChatDBG: Augmenting Debugging with Large Language Models标题中文让大模型接管调试器ChatDBG 智能调试助手作者Kyla H. Levin, Nicolas van Kempen, Emery D. Berger, Stephen N. Freund机构University of Massachusetts Amherst · Williams College · Amazon Web Services会议FSE 2025Proc. ACM Softw. Eng., PACMSE Vol.2, FSE IssueDOI10.1145/3729355arXivhttps://arxiv.org/abs/2403.16354项目网站https://github.com/plasma-umass/ChatDBG背景与动机调试器的功能清单从 1961 年的 DDT 起就几乎定型断点、单步、栈导航、打印变量、watchpoint。工具负责把信息摆出来推理仍然由人完成——程序员必须自己提出假设、读懂别人写的代码、在可能数十个栈帧与大量程序数据里翻找线索。论文给出的判断是真正缺的不是更多观察手段而是理解能力。这条六十年不变的历史线正好解释了本文的位置1981 年 Weiser 提出程序切片试图把该看哪段代码变成可计算问题2010 年前后的 Whyline 让程序员从预设查询里挑问题近年的故障定位与自动修复工作DeepFL、Grace、DeepRL4FL、LLMAO、AutoFL大多依赖静态特征或仅能访问源码。与 ChatDBG 几乎同期的工作各有短板对话式调试助手 Robin 只能拿到用户在对话里手动提供的上下文没有运行时状态访问权其能力大致相当于 ChatDBG 的Enriched Stack配置AutoCodeRover、SWE-agent、RepairAgent、AutoSD 以 issue 描述与源码为主且通常要求给定失败的测试用例与缺陷位置AutoFL 虽已用上 function call但取到的仍是静态信息。ChatDBG 的差异可以用一句话概括它是第一个把运行时程序状态与调试器控制权一起交给 LLM 的调试助手因而无需测试用例、无需定位缺陷直接把调试会话本身变成模型的可操作环境。研究主线从问题到结论图 6ChatDBG 研究主线——从工具只摆信息到模型自己接管调试器Mermaid 流程图基准/方法设计ChatDBG 的整体结构是一个五步命令循环① 命令分流——标准调试器命令如p num_trials原样交给底层调试器执行命令与输出被记录进 history② 构造提示——自由文本被转换为提示首次对话打包指令、增强栈轨迹、程序输入、错误描述与历史③ 发送——提示送入 LLM 并流式处理返回④ 接管方向盘——模型以函数调用请求执行调试器命令结果回灌给模型继续推理同时对用户可见⑤ 回答——模型输出散文式分析并把控制权交还程序员。图 1ChatDBG 架构——①标准命令由既有调试器处理②自由文本被转成提示③提示发给 LLM④LLM 接管方向盘直接向调试器下命令必要时调用 language server 等工具⑤LLM 给出回答。这套设计与主流做法最根本的分歧在于上下文获取方式一种思路是像检索增强生成RAG那样事先把任务相关数据向量化、检索进提示论文明确否定这条路线理由是程序状态每个调试会话都不相同、也不易向量化因此更有效的做法是让模型按需索取——它想看的变量、想读的函数都由它自己通过debug与info命令现场取回。分类全景图 7调试器能力矩阵——LLM 补上的是最后一类推理能力Mermaid 分类图方法细节论文的技术贡献集中在四处设计上。第一增强栈轨迹。传统调试器每帧只给函数名、位置最多几行源码ChatDBG 的栈轨迹额外携带变量的类型与取值并把每帧源码窗口从 $5$ 行扩大到至少 $10$ 行同时剔除库代码帧把模型的注意力压到用户代码上——论文的假设是用户代码才是错误的常见来源。第二值到字符串的预算控制。把程序里的对象喂给模型难点是信息够用与别淹没上下文之间的平衡。ChatDBG 优先调用对象的__repr__否则递归展开字段与聚合结构元素数量限制在固定的一个小数字多余的用省略号表示递归转换深度被截断在 $d \le 3$再深的值同样省略。如果省略掉的信息仍然重要模型可以随时通过接管机制把它要回来。第三接管方向盘的工具集与代码导航扩展。LLM 通过 function call 获得一组工具debug(command)直接执行调试器命令Pdb 走onecmdLLVM 走SBCommandInterpreter.HandleCommandinfo(symbol)打印函数、类、字段、方法或包的 docstring 与用户代码源码。面向原生代码因为缺乏等价的符号级文档支持ChatDBG 另外新增两条 LLDB 命令并借助 clangd 语言服务器JSON-RPC / LSP实现符号定位。新增命令调试器输出info symbolPdb任意函数、方法、字段、类或包的源码与 docstringslice symbolPdb全局变量symbol的反向切片源码仅交互式 IPython / Notebookcode locLLDBfilename:lineno附近的源码definition loc symbolLLDBloc处首次出现的symbol的定义位置与源码第四笔记本的分层切片。交互式会话IPython / Jupyter由许多独立求值的单元格组成单元格可能乱序执行、互相覆盖定义并通过全局变量通信。ChatDBG 因此提供一个slice命令借助 ipyflow 计算反向切片对当前单元格中引用、且由先前单元格定义的变量返回其依赖单元格的源码。对笔记本而言这条命令几乎是接管机制生效的前提。实验设计与结果评测分两个上下文规模较小但正确性标准明确的学生 Python 程序以及真实的C/C 应用。Python 主套件共 22 个程序——8 个命令行脚本29–89 行c1–c8与 14 个 Jupyter 笔记本45–181 行s1–s14另用到约 3,000 行非标准库代码。这些程序未公开发表因此可以排除训练数据泄漏错误由真人引入涵盖作用域问题、算法错误、库函数误用与领域知识误解。作者把失败的单元测试替换为assert语句同时保留语义错误断言失败与崩溃两类。C/C 套件取自 BugBench 与 BugsC 的 8 个真实程序0.7k–58.9k 行必要时用 AddressSanitizer 强制在内存越界的那一刻崩溃。评测协议的关键是逐级加码的消融每个程序在每个配置下运行 10 次即每个配置 220 次试验模型固定为gpt-4-1106-preview而什么算成功的判定标准在查看回答之前就已写定。配置栈轨迹接管方向盘初始提问成功率Default Stack标准 5 行否why?≈20%Enriched Stack增强 10 行否why?≈31%Take the Wheel增强是why?57%Targeted Question增强是针对该缺陷的提问67%Dialog增强是针对性提问 追问85%图 2各配置下的总体成功率——增强栈轨迹、接管方向盘、用户提供的针对性上下文依次把效果推高全功能配置达到 85%论文 Figure 3。图 3命令行脚本c1–c8逐程序成功率竖线为均值。图 4Jupyter 笔记本s1–s14逐程序成功率——跨单元格的数据流必须由slice还原成因果链。图 5C/C 程序上修到根因 / 修到近因的成功率——近因修复稳定根因修复因程序而异。追加的对话轮次会显著改变结果Targeted Question说明哪怕最少量的期望行为描述例如我为什么读不对这个 CSV也有效而Dialog使用一条不带任何反馈的固定追问——继续解释你的推理并给我一个能按我描述工作的修复——就把成功率推到 85%。作者由此推断模型单轮响应的长度约束会限制它把推理走完追问的价值正是在于把推理补全。原生代码侧的结果分成两类修复。下表转写自论文对每个程序近因修复与根因修复的判据定义程序规模错误类型近因修复根因修复BC17.0k缓冲区溢出复制时截断改为动态大小GZIP8.2k缓冲区溢出复制时截断检查长度后退出NCOM1.9k缓冲区溢出复制时截断检查长度后退出POLY0.7k缓冲区溢出复制时截断检查长度后退出PEG14.7k空指针解引用判空告警退出TIFF58.9k除零覆盖取值非法值告警退出YAML18.7k栈溢出改为迭代限制递归深度YAML28.7k断言失败替换断言取下一个 token 前先检查结果对比总结图 8从标准栈到全功能配置——ChatDBG 成功率的逐级跃迁Mermaid 对比图关键发现接管方向盘是关键跃迁从Enriched Stack的约 31% 到Take the Wheel的 57%模型每次运行发出0–12 条调试命令最常用的是取信息的info、打印的p和笔记本场景的slice。对笔记本而言slice几乎不可或缺去掉slice后接管方向盘很少带来提升因为模型无法凭单元格的孤立视图理解跨单元格的数据依赖。增强栈的收益是不对称的它对崩溃类缺陷有效栈里已含足够线索但对计算已完成才失败的语义错误帮助有限需要靠接管机制补足上下文。人机对话决定上限针对性提问把成功率从 57% 提到67%再追加一轮无反馈的追问提到85%——收益比换模型或堆功能更确定。失败模式被如实报告提示更长更复杂时效果偶尔反而下降根因离可观测现象越远越难找到模型偶尔把比例与百分数混为一谈这些错误都可以由后续追问缓解。成本极低Targeted Question下一轮对话平均约 10,000 tokens约 7,500 词成本约 0.12 美元、耗时约 25 秒C/C 侧平均约 0.06 美元、27 秒。原生代码上近因修复稳定、根因修复分化总体为36% 命中根因 55% 命中近因缓冲区溢出场景下模型倾向把strcpy/sprintf换成strncpy/snprintf正确但会静默截断输入需要额外校验才算稳健修复。设计模式层面论文命中三类被顶会反复验证的创新模式——把一次调试提问分解并委托给专用求解器调试器命令、源码查询、反向切片、语言服务器、用受控消融逐一隔离混淆变量5 配置 × 22 程序 × 10 次运行、把两个原本固定的组件人驱动的命令循环、固定 5 行栈窗口解放为可自适应对象。局限性样本代表性主套件是未公开的学生实验代码未必代表有经验工程师写的代码C/C 套件则几乎全是内存错误断言失败、并发错误与其它逻辑错误可能得到不同结果。训练数据泄漏风险C/C 的源码与官方补丁公开在代码托管平台上如果进入过训练集会抬高这部分成绩。提示可能过拟合到特定模型结果受提示工程影响作者以最初用更早的 GPT-3.5-turbo 开发也能工作作为部分缓解。随机性与判分主观性靠每个程序运行 10 次稳定结果并以事先写定的标准降低人工判分的主观性。安全与信任LLM 可能通过debug下发任意代码例如删除文件。Python 侧用函数白名单清洗命令原生代码因语言更宽松而直接拒绝带函数调用的命令并为隔离环境保留--unsafe开关同时所有修复从不自动应用始终交由程序员判断后采纳。作者给出的未来方向接入已有故障定位方法来指引注意力、引入 delta debugging 缩减输入规模、接入时间旅行调试器以查询历史时刻的状态——难点在于如何让模型真正会用这些新工具。常见问题FAQChatDBG 和把报错粘贴到 ChatGPT 有什么区别后者大致等价于论文的Default Stack配置成功率约 20%。ChatDBG 让模型自己驱动调试器取运行时状态成功率提升到 57%再加针对性提问与追问可达 85%——差别来自模型能否主动查询程序状态而不是提示词写得好不好。为什么不用 RAG 把代码和状态检索进提示因为程序状态每个会话都不同也很难向量化。检索式方案需要预先建立可检索的表示而调试现场的状态是临时且高度具体的function call 让模型按需索取避免了把所有状态塞进上下文的规模瓶颈。ChatDBG 需要额外的模型训练吗不需要。论文明确指出LLM 对 GDB/LLDB/Pdb 的操作知识来自预训练无需微调即可上下移动栈帧、检查变量与堆数据、求值表达式。论文实现里真正需要新写的是调试器侧的命令扩展info、slice、code、definition。它支持哪些语言和调试场景PythonPdb / IPython / Jupyter含slice反向切片、C/CLLDB 插件另用 clangd 语言服务器取源码部分功能已移植到 GDB 与 WinDBG。Python 侧安装只需一个包加一条可选 shell 命令C/C 侧目标程序需以-g编译以保证 DWARF 调试信息可用。论文的写作有哪些可借鉴之处叙事上用接管方向盘这一驾驶隐喻替代了提示工程把权限转移讲得一目了然摘要里直接给出 67% 与 85% 两个数字证据框架是六维措辞中最强的一号杠杆贡献用显式列表列举范围锚定到三个具体调试器。需要留意的是文中第一个基于人工智能的调试助手属于无引用支撑的强声明而随着模型进步时间与成本将显著下降则是推测性承诺。参考链接论文 arXiv 摘要页https://arxiv.org/abs/2403.16354开源实现Apache-2.0FSE 2025 Distinguished Artifact Awardhttps://github.com/plasma-umass/ChatDBG论文归档版本Zenodo record 15185773https://zenodo.org/records/15185773SWE-agent以源码与 issue 为主的自动修复智能体NeurIPS 2024https://arxiv.org/abs/2405.15793AutoCodeRover自主程序改进ISSTA 2024https://doi.org/10.1145/3650212.3680384给大家推荐一款自用写文献综述、无虚构文献的 AI复旦大学 FudanNLP 团队自研 切问学术官网qiewenpaper.com覆盖3.6 亿篇可溯源真实中英文文献能自动整合文献观点生成规范综述还能挖掘研究创新点、复现实验配合视频教学新手快速上手文献综述写作后记博客的关键词集中在编程、算法、机器人、人工智能、数学等等持续高质量输出中。讨论QQ群白拾的小屋 (750365700)⭐B站账号白拾的物理AI组会活跃于知识区和动画区✨GitHub主页YhbCode000工程文件