×
¥
查看详情
🔥 会员专享 文生文 工具

代码调试助手

👁️ 508 次查看
📅 Dec 8, 2025
💡 核心价值: 本提示词帮助开发者快速定位代码中的问题,解释错误原因,并提供修正后的代码示例及优化建议,支持多语言代码调试与测试用例开发,提升调试效率和代码质量。

🎯 可自定义参数(5个)

编程语言
需要调试的编程语言类型
错误描述
代码运行或编译时出现的错误信息描述
代码内容
需要调试的完整代码内容
调试目标
代码调试的特定目标方向
测试条件
验证代码修正效果的测试场景

🎨 效果示例

问题识别

  • 位置:函数 parse_numbers 在处理空输入时直接 return(返回 None)。
  • 影响:调用 sum_of_squares(parse_numbers(" ")) 时,sum_of_squares 内部尝试遍历 nums,由于 numsNone,触发 TypeError: 'NoneType' object is not iterable

原因解释

  • 在 Python 中,return 不带返回值等价于返回 None。当前代码对空白输入分支仅打印信息后直接 return,导致返回 None
  • sum_of_squares 假定传入参数是可迭代对象(如 list),当收到 None 时在 for n in nums: 处抛出 TypeError
  • 期望行为是:空输入应解析为空列表 [](从而平方和为 0),或显式抛出说明性异常。现状两者皆未满足。

修复代码

下面给出可直接运行的修复版本,包含:

  • 修复后的 parse_numbers:对空输入返回空列表 [];对非数字行抛出带行号的 ValueError。
  • 原有 sum_of_squares 保持不变(其对空列表自然返回 0)。
  • 示例运行与单元测试(涵盖正常路径、空输入、包含空行和空格、非数字行、类型错误)。
# numbers.py

from typing import Iterable, List


def parse_numbers(text: str) -> List[int]:
    """
    将多行文本解析为整数列表。
    规则:
    - 非 str 参数:抛出 TypeError
    - 仅包含空白或为空:返回 []
    - 非数字行:抛出 ValueError,包含行号与原始行内容
    - 忽略空行与前后空格
    """
    if not isinstance(text, str):
        raise TypeError("text must be str")

    # 空白输入:返回空列表,避免后续遍历 None 触发 TypeError
    if not text.strip():
        return []

    nums: List[int] = []
    for idx, line in enumerate(text.splitlines(), start=1):
        s = line.strip()
        if not s:
            continue
        try:
            nums.append(int(s))
        except ValueError as e:
            # 显式报错并告知问题行
            raise ValueError(f"non-numeric value on line {idx}: {line!r}") from e
    return nums


def sum_of_squares(nums: Iterable[int]) -> int:
    """
    计算给定整数序列所有元素的平方和。
    """
    total = 0
    for n in nums:
        total += n * n
    return total


if __name__ == "__main__":
    # 示例:正常路径与空输入
    sample = "1\n2\n3"
    print(sum_of_squares(parse_numbers(sample)))   # 期望 14
    print(sum_of_squares(parse_numbers("   ")))    # 期望 0

    # 单元测试
    import unittest

    class TestNumbers(unittest.TestCase):
        def test_normal(self):
            text = "1\n2\n3"
            nums = parse_numbers(text)
            self.assertEqual(nums, [1, 2, 3])
            self.assertEqual(sum_of_squares(nums), 14)

        def test_empty_input(self):
            for text in ("", "   ", "\n\t  \n"):
                nums = parse_numbers(text)
                self.assertEqual(nums, [])
                self.assertEqual(sum_of_squares(nums), 0)

        def test_mixed_spaces_and_empty_lines(self):
            text = " 1 \n \n  2\n  3  \n"
            nums = parse_numbers(text)
            self.assertEqual(nums, [1, 2, 3])
            self.assertEqual(sum_of_squares(nums), 14)

        def test_non_numeric_line_raises(self):
            text = "1\na\n3"
            with self.assertRaises(ValueError) as cm:
                parse_numbers(text)
            self.assertIn("line 2", str(cm.exception))

        def test_type_error_on_non_str(self):
            with self.assertRaises(TypeError):
                parse_numbers(123)  # type: ignore

    unittest.main(argv=["-m", "numbers"], exit=False)

简要改进说明

  • 修复空输入返回 None 的问题:改为返回空列表 [],使 sum_of_squares 得到 0,符合预期。
  • 非数字行显式抛出包含行号的 ValueError,便于定位数据问题。
  • 保持 sum_of_squares 简单清晰,复用可迭代协议,支持 list、生成器等。
  • 补充单元测试覆盖正常、空输入、混合空行/空格、非数字行与类型错误场景。

可选扩展

  • 如果你希望对空输入抛出异常,而不是返回 [],可在 parse_numbers 中将空白判断分支改为:
    • raise ValueError("empty input") 并调整对应测试期望。当前实现选择返回 [] 以满足题目给定测试条件。

问题识别

  • 错误位置:函数 loadTodos 内
    • 具体代码:const json = res.json();
    • 随后访问:json.data.map(...)
  • 报错信息:TypeError: Cannot read properties of undefined (reading 'map')
  • 触发原因:res.json() 返回的是 Promise,未使用 await,导致 json 为 Promise,对 json.data 的访问得到 undefined,继续 .map 时抛出异常。

原因解释

  • 在 Fetch API 中,Response.prototype.json() 是异步方法,返回 Promise。
  • 未加 await 时,json 是一个 Promise 对象,不包含 data 属性;json.dataundefined,对其调用 .map 会抛 TypeError。
  • 另外,原实现中即使捕获到错误也没有统一返回值,可能导致调用方获得 undefined,并出现不一致的错误处理行为。

修复代码

下面给出可直接运行的修复版本,包含:

  • 修复点:对 res.json() 使用 await
  • 统一错误处理:对 HTTP 非 2xx、结构不符或网络异常,记录日志并返回空数组 []
  • 可注入的 fetch,便于单测
  • 基于 mock fetch 的最小可运行“单测”示例(成功、HTTP 错误、网络异常)
// 修复后的实现:Node 18+
async function loadTodos(userId, fetchFn = globalThis.fetch) {
  const url = `https://example.test/api/todos?userId=${userId}`;
  try {
    const res = await fetchFn(url);
    if (!res.ok) {
      console.error(`loadTodos http error: HTTP ${res.status} url=${url}`);
      return [];
    }

    // FIX: 必须 await
    const json = await res.json();

    // 防御式校验:确保 json.data 为数组
    const data = Array.isArray(json?.data) ? json.data : [];
    return data.map((t) => String(t?.title ?? "").toUpperCase());
  } catch (err) {
    // 统一错误处理:记录并返回空数组,避免未处理拒绝
    console.error(`loadTodos failed: url=${url}`, err);
    return [];
  }
}

/* ---------------------- 基于 mock fetch 的可运行测试 ---------------------- */

// 成功返回:{ data: [{title:'a'}, {title:'b'}] } -> ['A', 'B']
function mockFetchSuccess() {
  return Promise.resolve({
    ok: true,
    status: 200,
    json: async () => ({ data: [{ title: "a" }, { title: "b" }] }),
  });
}

// HTTP 非 2xx
function mockFetchHttpError() {
  return Promise.resolve({
    ok: false,
    status: 500,
    json: async () => ({ message: "server error" }),
  });
}

// 网络异常(例如连接超时、DNS 失败等)
function mockFetchNetworkError() {
  return Promise.reject(new Error("network failure"));
}

// 简单演示性“单测”(无需依赖测试框架)
(async () => {
  // 成功用例
  const r1 = await loadTodos(7, mockFetchSuccess);
  console.log("success case:", r1); // 期望: ['A', 'B']

  // HTTP 错误用例
  const r2 = await loadTodos(7, mockFetchHttpError);
  console.log("http error case:", r2); // 期望: []

  // 网络异常用例
  const r3 = await loadTodos(7, mockFetchNetworkError);
  console.log("network error case:", r3); // 期望: []
})();

/*
改进说明:
- 修复:为 res.json() 添加 await,避免将 Promise 当作对象使用。
- 稳健性:对非 2xx 响应、结构不符合预期的响应进行兜底处理,避免再次抛错。
- 统一错误处理:所有异常路径均记录日志并返回 [],避免未处理的 Promise 拒绝。
- 可测试性:将 fetch 作为可注入依赖,便于使用 mock 进行单元测试。
测试建议:
- 使用 Jest 等框架时,可用 jest.fn() 模拟 fetch,并对不同分支(成功、HTTP 错误、异常抛出、data 非数组、title 非字符串)分别断言返回值与 console.error 调用次数/内容。
- 可增加超时与中止测试(AbortController)以覆盖长耗时场景。
*/

1. 问题识别

  • 出错位置:inc 函数中对共享 map 的自增操作 counts[key] = counts[key] + 1
  • 问题类型:并发写共享 map(读-改-写复合操作)未加锁,导致 Go 运行时检测到 concurrent map writes 并崩溃。

2. 原因解释

  • Go 内建的 map 不是并发安全的。并发写同一个 map(或读写交错)会破坏内部哈希桶结构的一致性,触发 fatal error: concurrent map writes。
  • 自增是读-改-写三步复合操作,每步都可能与其他 goroutine 交错执行,造成数据竞争与结构破坏。
  • GOMAXPROCS(4) 增加了并发度,更容易复现该问题。即使不崩溃,也会因为数据竞争导致计数不准确。

3. 修复代码

提供两种可直接运行的修复方案:

  • 方案 A:使用 sync.Mutex 保护 map
  • 方案 B:使用 sync.Map + 每个键存放 atomic.Int64,实现原子增量

运行说明:

  • go run -race main.go(应无数据竞争/崩溃,输出两个方案的计数结果都为 10000)
  • go test -race(见下方测试代码,均应通过)

完整可运行代码(main.go):

package main

import (
	"fmt"
	"runtime"
	"sync"
	"sync/atomic"
)

// 方案 A:使用 sync.Mutex 保护普通 map
func runWithMutex() int {
	var (
		mu sync.Mutex
		m  = map[string]int{}
		wg sync.WaitGroup
	)
	inc := func(key string, n int) {
		defer wg.Done()
		for i := 0; i < n; i++ {
			mu.Lock()
			m[key] = m[key] + 1
			mu.Unlock()
		}
	}

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go inc("ok", 1000)
	}
	wg.Wait()
	return m["ok"]
}

// 方案 B:使用 sync.Map,值为 *atomic.Int64,避免锁下读改写
func runWithSyncMap() int64 {
	var (
		counts sync.Map // map[string]*atomic.Int64
		wg     sync.WaitGroup
	)
	inc := func(key string, n int) {
		defer wg.Done()
		// 为 key 放入一个原子计数器(仅首次需要存储)
		v, _ := counts.LoadOrStore(key, &atomic.Int64{})
		counter := v.(*atomic.Int64)
		for i := 0; i < n; i++ {
			counter.Add(1) // 原子自增
		}
	}

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go inc("ok", 1000)
	}
	wg.Wait()

	v, _ := counts.Load("ok")
	return v.(*atomic.Int64).Load()
}

func main() {
	runtime.GOMAXPROCS(4)

	c1 := runWithMutex()
	fmt.Println("mutex count:", c1) // 期望 10000

	c2 := runWithSyncMap()
	fmt.Println("sync.Map count:", c2) // 期望 10000
}

测试代码(main_test.go):

package main

import (
	"runtime"
	"testing"
)

func TestMutex(t *testing.T) {
	runtime.GOMAXPROCS(4)
	got := runWithMutex()
	if got != 10000 {
		t.Fatalf("mutex count want 10000, got %d", got)
	}
}

func TestSyncMap(t *testing.T) {
	runtime.GOMAXPROCS(4)
	got := runWithSyncMap()
	if got != 10000 {
		t.Fatalf("sync.Map count want 10000, got %d", got)
	}
}

验证与运行:

  • 直接运行(含数据竞争检测)
    • go run -race main.go
    • 期望输出:
      • mutex count: 10000
      • sync.Map count: 10000
  • 单元测试(含数据竞争检测)
    • go test -race
    • 应全部通过且无 data race 报告

简要改进与性能权衡:

  • 方案 A(Mutex):
    • 优点:实现简单、对少量热点键/频繁写入的场景通常更快。
    • 缺点:高写入并发下同一把锁会有争用;每次自增都持锁。
    • 可优化:将每个 goroutine 的增量先用局部变量累加,再一次性加到 map 中,减少加锁次数(例如每个 goroutine 累加 1000 次后一次性加锁写入)。
  • 方案 B(sync.Map + atomic):
    • 优点:键的生命周期与并发访问分离;对“多键、多读少写”的场景更合适;使用 atomic.Int64 保证自增无锁(除首次 LoadOrStore)。
    • 缺点:对单一热点键频繁写入,sync.Map 的内部开销通常高于简单的互斥锁。
  • 通用建议:
    • 若键数量少、写入频繁:优先 Mutex(或分片锁/分段 map)。
    • 若键数量多、写多读少:考虑分片 map + Mutex。
    • 若键数量多、读远多于写:sync.Map 更合适。
    • 无论采用哪种方案,使用 -race 持续验证并发安全。

示例详情

📖 如何使用

30秒出活:复制 → 粘贴 → 搞定
与其花几十分钟和AI聊天、试错,不如直接复制这些经过千人验证的模板,修改几个 {{变量}} 就能立刻获得专业级输出。省下来的时间,足够你轻松享受两杯咖啡!
加载中...
💬 不会填参数?让 AI 反过来问你
不确定变量该填什么?一键转为对话模式,AI 会像资深顾问一样逐步引导你,问几个问题就能自动生成完美匹配你需求的定制结果。零门槛,开口就行。
转为对话模式
🚀 告别复制粘贴,Chat 里直接调用
无需切换,输入 / 唤醒 8000+ 专家级提示词。 插件将全站提示词库深度集成于 Chat 输入框。基于当前对话语境,系统智能推荐最契合的 Prompt 并自动完成参数化,让海量资源触手可及,从此彻底告别"手动搬运"。
即将推出
🔌 接口一调,提示词自己会进化
手动跑一次还行,跑一百次呢?通过 API 接口动态注入变量,接入批量评价引擎,让程序自动迭代出更高质量的提示词方案。Prompt 会自己进化,你只管收结果。
发布 API
🤖 一键变成你的专属 Agent 应用
不想每次都配参数?把这条提示词直接发布成独立 Agent,内嵌图片生成、参数优化等工具,分享链接就能用。给团队或客户一个"开箱即用"的完整方案。
创建 Agent

✅ 特性总结

快速定位代码问题,帮助用户迅速找到并理解代码中的错误。
智能分析错误原因,为每个问题提供详细、易懂的解释。
自动生成修正后的代码,让用户轻松完成问题修复。
支持多种编程语言,覆盖主流开发场景,适配更多用户需求。
上下文敏感分析,针对具体问题提供精准的代码修复建议。
操作便捷,无需手动调整,只需输入问题代码即可获得全面解决方案。
减少调试时间,提升开发效率,助力用户专注于核心功能开发。
专业建议与修正方案兼具,可帮助新手快速提升代码能力。
灵活应用于开发、学习、测试等多种场景,让每位用户都能快速获益。

🎯 解决的问题

帮助开发者快速定位代码中的问题,提供清晰的问题原因分析,并给出精准的修正建议,以提升代码调试效率和开发体验。

🕒 版本历史

当前版本
v2.1 2024-01-15
优化输出结构,增强情节连贯性
  • ✨ 新增章节节奏控制参数
  • 🔧 优化人物关系描述逻辑
  • 📝 改进主题深化引导语
  • 🎯 增强情节转折点设计
v2.0 2023-12-20
重构提示词架构,提升生成质量
  • 🚀 全新的提示词结构设计
  • 📊 增加输出格式化选项
  • 💡 优化角色塑造引导
v1.5 2023-11-10
修复已知问题,提升稳定性
  • 🐛 修复长文本处理bug
  • ⚡ 提升响应速度
v1.0 2023-10-01
首次发布
  • 🎉 初始版本上线
COMING SOON
版本历史追踪,即将启航
记录每一次提示词的进化与升级,敬请期待。

💬 用户评价

4.8
⭐⭐⭐⭐⭐
基于 28 条评价
5星
85%
4星
12%
3星
3%
👤
电商运营 - 张先生
⭐⭐⭐⭐⭐ 2025-01-15
双十一用这个提示词生成了20多张海报,效果非常好!点击率提升了35%,节省了大量设计时间。参数调整很灵活,能快速适配不同节日。
效果好 节省时间
👤
品牌设计师 - 李女士
⭐⭐⭐⭐⭐ 2025-01-10
作为设计师,这个提示词帮我快速生成创意方向,大大提升了工作效率。生成的海报氛围感很强,稍作调整就能直接使用。
创意好 专业
COMING SOON
用户评价与反馈系统,即将上线
倾听真实反馈,在这里留下您的使用心得,敬请期待。
加载中...