PolarDB-X团队实践:AI Agent修Bug的瓶颈不是写代码,而是让分析经得起实际执行的验证
年初,PolarDB-X团队的盛涛涛修了一个让他印象深刻的Bug。最终只改了两行代码,但查日志、看监控、分析问题花了一整天,复现调试挤在会议间隙断断续续做了近一周,之后还要补测试用例、跟进代码审查直到合并。AI已经能帮忙写那两行代码,但真正消耗时间的是前面的工作。能不能把这些也交给Agent?
团队把开发任务分成两类:新功能和迭代优化需要开发者主导方案设计,Agent辅助编码测试;而处理告警工单、修复缺陷这类工作,问题定义相对明确,代码改动通常很小,结果可以通过测试验证。他们尝试让Agent自主完成后一类任务,开发者只负责审查交付物。
但让Agent自主完成这个闭环,首先需要确保它的输出可靠。讨论可靠性时人们往往关注编码阶段,希望用特定技能或约束保证代码正确。盛涛涛指出,在缺陷修复中,可靠复现才是最重要的一步。没有复现,很难确认分析是否正确;如果分析本身是错的,即使代码结构再完美也可能无法解决真正的问题。他们据此确立三个关键要求:事故信息必须完整、问题必须可以可靠复现、修复必须通过测试验证。
围绕这三个要求,团队做了大量工具和环境建设。在信息获取方面,他们把监控、日志、实例拓扑等常用平台功能封装成CLI工具,让Agent能自主查询结构化数据而非依赖截图。对于维护不善、没有现成Agent友好接口的平台,他们参考已有CLI的实现和认证方式,让Agent分析网页底层API请求后自行封装,大约一周内完成了常用功能的集成。
真正让团队意识到问题严重性的,是一个低概率并发Bug。这个Bug在生产环境存在很久,因为发生稀少且难以复现,始终无法定位原因。Agent收到事故信息后几分钟就产出了一份分析报告,详细描述了代码位置、执行流程和可能的失败点,看起来专业且有说服力。但团队花了大约两小时验证,发现解释站不住脚。反馈给Agent后它很快产出新分析,验证后仍然错误。来回几轮,报告堆了一摞,问题依然没有解释。
根本原因在于,Agent当时只具备静态代码分析能力,无法准备环境、设置断点、控制线程执行顺序或检查内存数据。它的解释与程序实际运行行为不匹配,无法独立完成验证。为解决这个问题,团队添加了两类工具:调试和内存分析。
调试方面,核心组件用Java编写,团队最初尝试JDK自带的JDB,但它面向人类交互设计,需要维护终端进程、通过进程间通信发送命令和读取输出,对Agent来说很笨重。他们基于Java调试接口重新实现了JDB CLI,让工具在后台保持调试会话和状态,每次前台命令执行完即可退出,下次调用继续操作同一会话。结果以结构化形式返回,Agent可以解析。关键能力是线程特定断点:只有目标线程能触发断点,命中时只挂起该线程,其他线程继续运行。配合恢复操作,可以控制相关线程按特定顺序交替执行。
内存分析方面,通过Java程序的堆内存快照(Heap Dump)可以检查相关对象的字段值、引用关系和内存使用。Heap Dump文件通常很大,团队将其放在大内存云服务器上集中加载处理,为Agent提供专门的查询接口。Agent按需查询内存数据并基于结果继续分析,不必在本地处理整个大文件。
有了工具,Agent还需要运行时环境。团队提供两种选择:PolarDB-X Zero可以在几秒内创建临时实例,适合快速复现SQL错误或异常功能等简单问题;如果需要特定历史版本、特定拓扑或复杂并发场景,则在K8s中搭建完整复现环境,匹配受影响实例的版本和拓扑。完成代码修改后,Agent还可以将修复版本部署到该环境,用同样方式检查原始问题是否已解决。
回到那个并发Bug。这次Agent可以自己尝试复现,基于实际执行结果继续分析和调试。经过几轮迭代,它找到了关键触发条件,复现了与原始问题相同的MDL锁泄漏状态。关键就是Agent用调试工具让两个线程按特定顺序交替执行,故意重现了之前很难遇到的间歇性问题。调试结果还可以与内存状态交叉验证,确认复现的确实是同一个问题。至此,根因分析和可重复的操作序列都有了,Agent的分析有了实际执行的证据支撑。
在交付环节,团队把可靠复现的测试用例作为进入代码审查的关键门槛。Agent添加了测试并且通过,不足以说明原始问题已解决;必须先确认测试用例确实触发了该问题。同一个测试用例必须在修复前的版本上可靠复现原始问题,在修复后的版本上验证问题不再出现。只有这个前后验证完成、全量回归测试通过,代码才能进入审查。
这套工作流运行六个月后,团队通过处理上万条告警识别并记录了200多个缺陷,其中70%以上可以可靠复现,并在进入代码审查前由Agent完成修复。所有告警首先经过Agent的初步分析和处理,实现首轮100%覆盖。
盛涛涛总结了三条可迁移的工程经验:第一,让开发系统对Agent可访问,从团队常用系统开始,配备CLI工具或暴露API接口;第二,让开发过程可验证,提供调试工具和运行时环境,让Agent能复现问题并自行验证分析,实际执行的反馈是它发现错误、调整分析并最终完成修复的关键;第三,让任务工作流能持续运行,将工作流移到云端,使Agent不依赖开发者本地电脑。
需要指出的是,以上所有数据均为PolarDB-X团队自报,未经独立验证。该方法适用于问题定义明确、代码改动较小的缺陷修复场景,对需要开发者主导方案设计的新功能开发仍采用辅助编码模式。自建CLI工具和定制调试接口需要一定基础设施投入,迁移到其他团队的成本取决于其现有系统的可访问性。