调试 JavaScript 和 TypeScript
--inspect
运行 Bun 代码时使用 --inspect 标志,可以启用调试功能。该标志会自动启动一个 WebSocket 服务器,监听一个可用端口,用于检查运行中的 Bun 进程。
terminal
--inspect-brk
--inspect-brk 标志行为与 --inspect 相同,不同的是它会在执行脚本的第一行自动插入一个断点。这对于调试运行很快并立即退出的脚本非常有用。
--inspect-wait
--inspect-wait 标志的行为与 --inspect 相同,但代码会等待直到调试器附加到运行进程才开始执行。
为调试器设置端口或 URL
无论使用哪个标志,都可以选择性地指定端口号、URL 前缀或两者。terminal
调试器
各种调试工具可以连接到此服务器,提供交互式调试体验。debug.bun.sh
Bun 在 debug.bun.sh 提供了一个基于 Web 的调试器。它是 WebKit 的 Web Inspector Interface 的修改版本,Safari 用户会觉得很熟悉。
打开提供的 debug.bun.sh URL 在浏览器中启动调试会话。在该界面,你可以查看正在运行文件的源代码,查看和设置断点,并使用内置控制台执行代码。
3 行的行号,在 console.log(req.url) 语句上设置断点。
http://localhost:3000 。这会向我们的本地服务器发送 HTTP 请求。页面似乎无法加载,这是因为程序已在先前设置的断点处暂停执行。
注意界面发生的变化。
req 变量。
- 继续执行脚本 — 程序继续运行直到遇到下一个断点或异常。
- 单步跳过 — 程序继续执行到下一行。
- 单步进入 — 如果当前语句包含函数调用,则调试器会“进入”被调用函数内部。
- 单步跳出 — 如果当前语句是函数调用,调试器会完成该函数执行,然后“跳出”函数回到调用处。

Visual Studio Code 调试器
Visual Studio Code 提供了对 Bun 脚本调试的实验性支持。使用前需要安装 Bun VSCode 扩展。调试网络请求
BUN_CONFIG_VERBOSE_FETCH 环境变量允许你自动打印通过 fetch() 或 node:http 发起的网络请求。
| 值 | 描述 |
|---|---|
curl | 以 curl 命令格式打印请求 |
true | 打印请求和响应信息 |
false | 不打印任何内容,默认值 |
以 curl 命令打印 fetch 和 node:http 请求
Bun 也支持将fetch() 和 node:http 网络请求打印为 curl 命令,只需把 BUN_CONFIG_VERBOSE_FETCH 环境变量设置为 curl。这会将 fetch 请求打印为一行 curl 命令,方便你复制粘贴到终端中复现请求。
[fetch] > 标记的行是本地代码发出的请求,以 [fetch] < 标记的行是远程服务器的响应。
BUN_CONFIG_VERBOSE_FETCH 环境变量在 fetch() 和 node:http 请求中均支持,因此应该都能正常工作。
如果只想打印请求和响应信息,但不打印 curl 命令,可以将该环境变量设置为 true。
堆栈跟踪和 sourcemaps
Bun 会对每个文件进行转译,这看起来似乎会导致控制台中显示的堆栈跟踪不准确,只指向转译后的文件。为了解决这个问题,Bun 会自动为转译的每个文件生成并提供 sourcemap。当你在控制台看到堆栈跟踪时,点击文件路径即可跳转到原始源代码,即使它是 TypeScript 或 JSX 编写的,或经过了其他转换。 Bun 会在运行时按需转译文件时自动加载 sourcemaps,也会在使用bun build 预编译文件时加载。
带语法高亮的源代码预览
为了帮助调试,当发生未捕获的异常或拒绝时,Bun 会自动打印一段小的源代码预览。你可以通过调用Bun.inspect(error) 来模拟此行为:
V8 堆栈跟踪
Bun 使用 JavaScriptCore 作为其引擎,但许多 Node.js 生态和 npm 期望使用 V8。不同的 JavaScript 引擎对error.stack 的格式不同。Bun 旨在作为 Node.js 的无缝替代品,因此我们负责确保即使引擎不同,堆栈跟踪的格式尽可能相似。
这就是为什么在 Bun 中打印 error.stack,格式与 Node.js 的 V8 引擎一致。这在使用期望 V8 堆栈跟踪的库时尤其有用。
V8 堆栈跟踪 API
Bun 实现了 V8 堆栈跟踪 API,它是一组允许你操作堆栈跟踪的函数。Error.prepareStackTrace
Error.prepareStackTrace 是一个全局函数,可以定制堆栈跟踪的输出。该函数接收错误对象和一个 CallSite 对象数组,并返回自定义的堆栈跟踪内容。
CallSite 对象的可用方法如下:
| 方法 | 返回值 |
|---|---|
getThis | 函数调用中的 this 值 |
getTypeName | this 的类型名 |
getFunction | 函数对象 |
getFunctionName | 函数名称,字符串 |
getMethodName | 方法名称,字符串 |
getFileName | 文件名或 URL |
getLineNumber | 行号 |
getColumnNumber | 列号 |
getEvalOrigin | undefined |
getScriptNameOrSourceURL | 源码 URL |
isToplevel | 如果函数在全局作用域中,返回 true |
isEval | 如果函数是 eval 调用,返回 true |
isNative | 如果函数是原生的,返回 true |
isConstructor | 如果函数是构造函数,返回 true |
isAsync | 如果函数是 async,返回 true |
isPromiseAll | 尚未实现 |
getPromiseIndex | 尚未实现 |
toString | 返回调用位置的字符串描述 |
Function 对象可能已被垃圾回收,因此部分方法可能返回 undefined。
Error.captureStackTrace(error, startFn)
Error.captureStackTrace 函数允许你在代码的特定位置捕获堆栈跟踪,而非错误抛出的地方。
这在有回调或异步代码时非常有用,因为它们使得确定错误源头变得困难。Error.captureStackTrace 的第二个参数是你希望堆栈跟踪起始的函数。
例如,下面代码会使 err.stack 指向调用 fn() 的代码,而不是错误实际上被抛出的 myInner。