第 12 章:调试代码
学会让 AI 帮你调试代码
第 12 章:调试代码 ⭐
本章解决什么问题:学会让 AI 帮你调试代码
学习目标:能够用自然语言让 AI 分析错误、定位问题、提供修复建议
版本基准:OpenClaw 3.13 前置条件:已完成第 11 章(改代码)
📋 实测验证说明:本章所有调试示例均经过实测验证,基于真实错误场景。
12.1 让 AI 分析错误信息
让 AI 帮你理解错误信息,找到问题原因。
基本用法
发送错误信息给 AI:
这个错误怎么修复?
TypeError: Cannot read properties of undefined (reading 'length') at processArray (app.js:15)
AI 回复(实测):
好的,分析这个错误:
**错误类型**:TypeError
**错误原因**:
尝试访问 undefined 对象的 length 属性
**问题位置**:app.js 第 15 行,processArray 函数
**可能原因**:
1. 传入 processArray 的参数是 undefined
2. 数组未正确初始化
3. 异步操作未完成就访问了数据
**修复方案**:
```javascript
function processArray(arr) {
// 添加防御性检查
if (!arr || !Array.isArray(arr)) {
console.warn('Invalid array:', arr);
return [];
}
// 现在可以安全访问 length
console.log(arr.length);
// ... 其他逻辑
}
建议:
- 在函数入口检查参数
- 使用默认参数值
- 检查异步操作的完成状态
> **🔍 实测说明**:实测时间 2026-03-20,AI 分析真实错误信息
> **💡 新手建议**:发送错误信息时,最好包含完整的错误堆栈和相关代码。
---
## 12.2 不同场景的调试
### 场景一:Python 异常
**发送**:
Python 报错了,帮我看看:
Traceback (most recent call last):
File "app.py", line 10, in <module>
result = divide(10, 0)
File "app.py", line 5, in divide
return a / b
ZeroDivisionError: division by zero
**AI 回复**(实测):
好的,分析这个错误:
错误类型:ZeroDivisionError
错误原因:除数为零
问题位置:app.py 第 5 行,divide 函数
修复方案:
def divide(a, b):
if b == 0:
raise ValueError("除数不能为零")
return a / b
或者添加默认处理:
def divide(a, b):
try:
return a / b
except ZeroDivisionError:
return float('inf') # 或返回 None、0 等
建议:在调用 divide 前检查除数是否为零。
### 场景二:JavaScript 异步问题
**发送**:
这段代码为什么拿不到数据?
function fetchData() {
let data;
fetch('/api/data')
.then(res => res.json())
.then(json => {
data = json;
});
return data;
}
**AI 回复**(实测):
好的,分析问题:
问题原因:异步操作未完成就返回了数据
fetch 是异步的,return data 执行时,数据还没返回,所以 data 是 undefined。
修复方案 1 - 使用 async/await:
async function fetchData() {
const res = await fetch('/api/data');
const data = await res.json();
return data;
}
// 调用
fetchData().then(data => {
console.log(data);
});
修复方案 2 - 返回 Promise:
function fetchData() {
return fetch('/api/data')
.then(res => res.json());
}
// 调用
fetchData().then(data => {
console.log(data);
});
建议:优先使用 async/await,代码更清晰。
### 场景三:内存泄漏
**发送**:
Node.js 应用内存占用越来越高,可能是什么原因?
**AI 回复**(实测):
好的,分析可能的原因:
常见内存泄漏原因:
- 未清理的定时器
// ❌ 问题代码
setInterval(() => {
// 持续执行
}, 1000);
// ✅ 修复
const timer = setInterval(() => {}, 1000);
// 不需要时清除
clearInterval(timer);
- 闭包引用
// ❌ 问题代码
function createListener() {
const largeData = new Array(1000000);
element.addEventListener('click', () => {
console.log(largeData); // 引用了 largeData
});
}
- 全局变量积累
// ❌ 问题代码
global.cache = [];
global.cache.push(data); // 只增不减
排查方法:
- 使用 Chrome DevTools 的 Memory 面板
- 查看 Heap Snapshot
- 对比不同时间点的内存快照
建议:
- 及时清理事件监听器
- 避免不必要的全局变量
- 使用弱引用(WeakMap/WeakSet)
### 场景四:逻辑错误
**发送**:
这段代码逻辑有问题,帮我看看:
def is_adult(age):
if age > 18:
return True
return False
**AI 回复**(实测):
好的,分析逻辑问题:
问题:age == 18 时返回 False,但 18 岁应该是成年
修复方案:
def is_adult(age):
if age >= 18: # 改为 >=
return True
return False
或者更简洁:
def is_adult(age):
return age >= 18
建议:
- 边界条件要仔细检查
- 添加单元测试覆盖边界值
---
## 12.3 高级用法
### 让 AI 添加调试日志
**发送**:
给这段代码添加调试日志:
def process_users(users):
result = []
for user in users:
if user.active:
result.append(user.name)
return result
**AI 回复**(实测):
好的,添加调试日志:
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
def process_users(users):
logger.debug(f"开始处理用户列表,共 {len(users)} 个用户")
result = []
for i, user in enumerate(users):
logger.debug(f"处理第 {i+1} 个用户:{user.name}, 状态:{user.active}")
if user.active:
result.append(user.name)
logger.debug(f"用户 {user.name} 已添加到结果")
logger.debug(f"处理完成,共 {len(result)} 个活跃用户")
return result
日志级别说明:
- DEBUG:调试信息
- INFO:一般信息
- WARNING:警告
- ERROR:错误
建议:生产环境可以设置日志级别为 INFO 或 WARNING。
### 让 AI 编写调试脚本
**发送**:
写一个脚本,帮我监控系统资源使用情况
**AI 回复**(实测):
好的,创建监控脚本:
monitor.py
import psutil
import time
def monitor_resources(interval=5):
"""监控系统资源"""
print("开始监控...(按 Ctrl+C 停止)")
try:
while True:
# CPU
cpu_percent = psutil.cpu_percent(interval=1)
# 内存
memory = psutil.virtual_memory()
# 磁盘
disk = psutil.disk_usage('/')
print(f"\n{'='*40}")
print(f"CPU: {cpu_percent}%")
print(f"内存:{memory.percent}% ({memory.used / 1024**3:.2f}GB / {memory.total / 1024**3:.2f}GB)")
print(f"磁盘:{disk.percent}% ({disk.used / 1024**3:.2f}GB / {disk.total / 1024**3:.2f}GB)")
print(f"{'='*40}")
time.sleep(interval)
except KeyboardInterrupt:
print("\n监控已停止")
if __name__ == "__main__":
monitor_resources()
运行方式:
pip install psutil
python monitor.py
功能:
- 实时监控 CPU 使用率
- 监控内存使用情况
- 监控磁盘使用情况
- 每 5 秒更新一次(可调整)
---
## 12.4 练习时间
### 练习 1:分析错误
**发送**(附带一个错误信息):
这个错误怎么修复?
观察 AI 如何分析错误并提供修复方案。
### 练习 2:定位问题
**发送**(附带一段有问题的代码):
这段代码为什么运行结果不对?
练习让 AI 分析逻辑问题。
### 练习 3:添加调试
**发送**:
给这段代码添加调试日志
练习让 AI 添加调试信息。
---
## 12.5 常见问题
### Q1:AI 能帮我实时调试吗?
**说明**:
- AI 不能实时连接你的应用
- 但可以分析你提供的错误信息
- 提供调试建议和方案
### Q2:如何向 AI 描述调试问题?
**建议**:
1. 提供完整的错误信息
2. 提供相关代码
3. 说明预期行为和实际行为
4. 说明已尝试的解决方法
### Q3:AI 能帮我写单元测试吗?
**说明**:
- 可以编写单元测试
- 覆盖常见场景和边界情况
- 帮助发现潜在问题
### Q4:调试时应该提供哪些信息?
**建议提供**:
- 错误堆栈
- 相关代码
- 输入数据
- 预期结果 vs 实际结果
- 环境信息(语言版本、操作系统等)
---
## ✅ 你已解锁能力
| 能力 | 状态 |
|------|------|
| 让 AI 分析错误信息 | ✅ 已掌握 |
| 让 AI 定位问题 | ✅ 已掌握 |
| 让 AI 提供修复建议 | ✅ 已掌握 |
| 让 AI 添加调试日志 | ✅ 已掌握 |
---
## 📊 自测题(3 题)
### 1. 如何向 AI 描述调试问题?
**答案**:提供错误堆栈、相关代码、预期行为、实际行为、环境信息
### 2. JavaScript 异步问题常见原因是什么?
**答案**:异步操作未完成就访问数据,应该使用 async/await 或 Promise
### 3. 如何让 AI 帮代码添加调试日志?
**答案**:发送代码并说"给这段代码添加调试日志"
---
## 🎯 下一章预告
第 13 章:项目配置
你将学会:
- 让 AI 管理项目配置
- 让 AI 修改配置文件
- 让 AI 理解配置结构
**提前试试**:
帮我看看 package.json 有哪些配置项
> 本文由郭峰主导,基于 GPT-5.4、OpenClaw Agent 完成,并经人工审校定稿。
---
> **课后练习**(可选)
> 1. 发送一个错误让 AI 分析
> 2. 发送有问题的代码让 AI 定位
> 3. 让 AI 给代码添加调试日志
>
> 有任何问题,随时在群里提问! 🚀