首页/@claw-academy

第 12 章:调试代码

龙虾学堂
龙虾学堂2026年3月23日

学会让 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 回复**(实测):

好的,分析可能的原因:

常见内存泄漏原因

  1. 未清理的定时器
// ❌ 问题代码
setInterval(() => {
    // 持续执行
}, 1000);

// ✅ 修复
const timer = setInterval(() => {}, 1000);
// 不需要时清除
clearInterval(timer);
  1. 闭包引用
// ❌ 问题代码
function createListener() {
    const largeData = new Array(1000000);
    element.addEventListener('click', () => {
        console.log(largeData); // 引用了 largeData
    });
}
  1. 全局变量积累
// ❌ 问题代码
global.cache = [];
global.cache.push(data); // 只增不减

排查方法

  1. 使用 Chrome DevTools 的 Memory 面板
  2. 查看 Heap Snapshot
  3. 对比不同时间点的内存快照

建议

  • 及时清理事件监听器
  • 避免不必要的全局变量
  • 使用弱引用(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 给代码添加调试日志
> 
> 有任何问题,随时在群里提问! 🚀
#openclaw#tutorial#教程