176 lines
6.3 KiB
JavaScript
176 lines
6.3 KiB
JavaScript
|
|
export const codeDebugTool = {
|
|||
|
|
name: "code_debug",
|
|||
|
|
description: "分析代码错误,返回结构化的调试信息:错误分类、常见原因、排查步骤和修复模式。",
|
|||
|
|
inputSchema: {
|
|||
|
|
type: "object",
|
|||
|
|
properties: {
|
|||
|
|
code: {
|
|||
|
|
type: "string",
|
|||
|
|
description: "有问题的代码",
|
|||
|
|
},
|
|||
|
|
error_message: {
|
|||
|
|
type: "string",
|
|||
|
|
description: "错误信息或堆栈跟踪",
|
|||
|
|
},
|
|||
|
|
language: {
|
|||
|
|
type: "string",
|
|||
|
|
description: "编程语言",
|
|||
|
|
},
|
|||
|
|
expected_behavior: {
|
|||
|
|
type: "string",
|
|||
|
|
description: "期望的正确行为(可选)",
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
required: ["code", "error_message", "language"],
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
const errorPatterns = [
|
|||
|
|
{
|
|||
|
|
pattern: /TypeError.*(?:undefined|null|is not a function|Cannot read prop)/i,
|
|||
|
|
category: "类型错误 (TypeError)",
|
|||
|
|
commonCauses: [
|
|||
|
|
"访问了 undefined/null 的属性",
|
|||
|
|
"函数调用目标不是函数",
|
|||
|
|
"异步操作返回值未正确 await",
|
|||
|
|
"解构赋值时对象为空",
|
|||
|
|
],
|
|||
|
|
fixStrategies: [
|
|||
|
|
"使用可选链 ?. 和空值合并 ??",
|
|||
|
|
"添加前置空值检查",
|
|||
|
|
"确认异步操作是否正确 await",
|
|||
|
|
"检查 import 路径和导出方式是否匹配",
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
pattern: /ReferenceError.*is not defined/i,
|
|||
|
|
category: "引用错误 (ReferenceError)",
|
|||
|
|
commonCauses: [
|
|||
|
|
"变量/函数未声明就使用",
|
|||
|
|
"拼写错误",
|
|||
|
|
"作用域问题(块级作用域、闭包)",
|
|||
|
|
"缺少 import 语句",
|
|||
|
|
],
|
|||
|
|
fixStrategies: [
|
|||
|
|
"检查变量名拼写",
|
|||
|
|
"确认 import/require 语句",
|
|||
|
|
"检查变量声明的作用域",
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
pattern: /SyntaxError/i,
|
|||
|
|
category: "语法错误 (SyntaxError)",
|
|||
|
|
commonCauses: [
|
|||
|
|
"括号/引号不匹配",
|
|||
|
|
"缺少分号或逗号",
|
|||
|
|
"关键字拼写错误",
|
|||
|
|
"ESM/CJS 混用",
|
|||
|
|
],
|
|||
|
|
fixStrategies: [
|
|||
|
|
"检查报错行及前几行的括号/引号匹配",
|
|||
|
|
"确认模块系统一致性(import vs require)",
|
|||
|
|
"使用格式化工具自动修复",
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
pattern: /ECONNREFUSED|ETIMEDOUT|ENOTFOUND|fetch failed|network/i,
|
|||
|
|
category: "网络错误",
|
|||
|
|
commonCauses: [
|
|||
|
|
"目标服务未启动",
|
|||
|
|
"URL/端口配置错误",
|
|||
|
|
"DNS 解析失败",
|
|||
|
|
"防火墙/代理阻断",
|
|||
|
|
"SSL 证书问题",
|
|||
|
|
],
|
|||
|
|
fixStrategies: [
|
|||
|
|
"确认目标服务运行状态和端口",
|
|||
|
|
"检查 URL 配置(协议、域名、端口)",
|
|||
|
|
"添加重试机制和超时控制",
|
|||
|
|
"检查网络连通性",
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
pattern: /ENOENT|no such file|Module not found|Cannot find module/i,
|
|||
|
|
category: "文件/模块未找到",
|
|||
|
|
commonCauses: [
|
|||
|
|
"文件路径错误",
|
|||
|
|
"依赖未安装(缺少 npm install)",
|
|||
|
|
"相对路径 vs 绝对路径搞混",
|
|||
|
|
"文件扩展名不匹配",
|
|||
|
|
],
|
|||
|
|
fixStrategies: [
|
|||
|
|
"检查文件路径和大小写",
|
|||
|
|
"运行 npm install 安装依赖",
|
|||
|
|
"检查 tsconfig/webpack 的路径别名配置",
|
|||
|
|
"确认文件扩展名(.js/.ts/.mjs)",
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
pattern: /Permission denied|EACCES|403|401|Unauthorized/i,
|
|||
|
|
category: "权限错误",
|
|||
|
|
commonCauses: [
|
|||
|
|
"文件权限不足",
|
|||
|
|
"API 认证失败(Token 过期/错误)",
|
|||
|
|
"CORS 跨域限制",
|
|||
|
|
],
|
|||
|
|
fixStrategies: [
|
|||
|
|
"检查文件/目录权限(chmod)",
|
|||
|
|
"检查 API Key / Token 是否有效",
|
|||
|
|
"配置正确的 CORS 头",
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
pattern: /out of memory|heap|stack overflow|Maximum call stack/i,
|
|||
|
|
category: "内存/栈溢出",
|
|||
|
|
commonCauses: [
|
|||
|
|
"无限递归",
|
|||
|
|
"处理超大数据集未分页",
|
|||
|
|
"内存泄漏(未清理的引用)",
|
|||
|
|
],
|
|||
|
|
fixStrategies: [
|
|||
|
|
"检查递归终止条件",
|
|||
|
|
"对大数据使用流式处理或分页",
|
|||
|
|
"使用 --max-old-space-size 调整堆内存",
|
|||
|
|
"排查事件监听器和定时器泄漏",
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
];
|
|||
|
|
export async function executeCodeDebug(args) {
|
|||
|
|
const { code, error_message, language, expected_behavior } = args;
|
|||
|
|
// 匹配错误模式
|
|||
|
|
const matched = errorPatterns.filter((ep) => ep.pattern.test(error_message));
|
|||
|
|
const categories = matched.length > 0 ? matched : [{
|
|||
|
|
category: "未分类错误",
|
|||
|
|
commonCauses: ["请仔细阅读完整错误信息和堆栈"],
|
|||
|
|
fixStrategies: ["根据错误信息定位问题代码行", "添加日志逐步排查"],
|
|||
|
|
}];
|
|||
|
|
// 从堆栈中提取行号
|
|||
|
|
const lineRefs = [];
|
|||
|
|
const lineRegex = /(?:at\s+.+?|File\s+.+?):(\d+)(?::(\d+))?/g;
|
|||
|
|
let match;
|
|||
|
|
while ((match = lineRegex.exec(error_message)) !== null) {
|
|||
|
|
lineRefs.push(`行 ${match[1]}${match[2] ? `:${match[2]}` : ""}`);
|
|||
|
|
}
|
|||
|
|
const output = [
|
|||
|
|
`# 调试分析报告`,
|
|||
|
|
``,
|
|||
|
|
`**语言**: ${language}`,
|
|||
|
|
``,
|
|||
|
|
`## 错误信息`,
|
|||
|
|
"```",
|
|||
|
|
error_message,
|
|||
|
|
"```",
|
|||
|
|
``,
|
|||
|
|
];
|
|||
|
|
if (lineRefs.length > 0) {
|
|||
|
|
output.push(`## 堆栈中的关键位置`, ...lineRefs.map((l) => `- ${l}`), ``);
|
|||
|
|
}
|
|||
|
|
for (const cat of categories) {
|
|||
|
|
output.push(`## 错误类型: ${cat.category}`, ``, `### 常见原因`, ...cat.commonCauses.map((c) => `- ${c}`), ``, `### 修复策略`, ...cat.fixStrategies.map((s) => `- ${s}`), ``);
|
|||
|
|
}
|
|||
|
|
if (expected_behavior) {
|
|||
|
|
output.push(`## 期望行为`, expected_behavior, ``);
|
|||
|
|
}
|
|||
|
|
output.push(`## 问题代码`, "```" + language, code, "```", ``, `## 排查步骤`, `1. 根据以上错误分类和常见原因,定位问题代码行`, `2. 在可疑位置添加日志输出,验证变量值`, `3. 根据修复策略实施修改`, `4. 编写测试用例确认修复有效`);
|
|||
|
|
return output.join("\n");
|
|||
|
|
}
|
|||
|
|
//# sourceMappingURL=codeDebug.js.map
|