在 VS Code 里调试 Swift 写的 iOS 应用,装上免费插件快蝎(KXApp)后,选好模拟器或 iPhone、在行号左侧设断点、按 ⌘R 即可,不需要写调试配置。断点停下后,变量、监视、调用栈都在 VS Code 的调试视图里,调试控制台可以用 po、bt 等 lldb 命令,App 的 print 输出在「输出 › kxapp Console」。这篇按调试时最常用的操作逐个说明,截至 2026 年 10 月,适用 Xcode 16 及以上。
开始前准备:Mac 上已安装 Xcode,VS Code 里装好插件并打开了 Xcode 工程,步骤见快速开始。
设断点并开始调试
- 在源码行号左侧点一下,出现红点就是断点。Swift、Objective-C、C、C++ 都可以设。
- 在状态栏选好 Scheme 和运行目标(模拟器或 iPhone)。
- 按 ⌘R(或 F5):插件构建、安装、启动 App,并接上调试器。
- 断点命中后用调试工具栏单步:继续(F5)、单步跳过(F10)、单步进入(F11)、单步跳出(⇧F11)。
- 按 ⌘. 停止调试。
调试工具栏上的「重启」不会重启 App,只会提示「这里不支持重启。请用“构建并运行”重新构建并启动 App。」,点提示里的「构建并运行」即可。改了代码也可以先按 ⌘. 停止再按 ⌘R(调试进行中 ⌘R 不生效),或点 Xcode 工程视图标题栏的「构建并运行」。
条件断点和日志断点
在断点上右键,选「编辑断点…」,或在行号左侧右键选「添加条件断点…」:
| 类型 | 填什么 | 效果 |
|---|---|---|
| 条件断点(表达式) | 一个布尔表达式,例如 index == 42、name == "admin" |
只在条件成立时停下 |
| 命中次数 | 一个数字,例如 10 |
从第 10 次经过开始停下(之后每次都停) |
| 日志断点 | 一行文本,变量写在 {} 里,例如 tapped {item.id} |
不停下,只在调试控制台输出一行 |
日志断点适合看循环或滚动回调里的值:不用改代码加 print,也不用重新编译。
查看变量、监视和调用栈
断点停下后,左侧调试视图里:
- 变量:当前函数的局部变量和
self,结构体、数组、字典可以展开。 - 监视:点「+」添加表达式,例如
items.count,每次停下自动刷新。 - 调用栈:列出各线程和调用链,点某一帧可以看那一帧的源码和变量。
- 断点:列出全部断点,可以临时停用、删除。
鼠标悬停在源码里的变量上,也能直接看到它的值。
调试控制台:po、p、bt
在「调试控制台」面板里可以输入 lldb 命令和表达式:
| 命令 | 作用 |
|---|---|
po self |
打印对象的描述(和 Xcode 里一样) |
p count |
打印变量的值和类型 |
v 或 frame variable |
列出当前帧的全部局部变量 |
bt |
打印当前线程的调用栈 |
po someFunction() |
执行一个表达式并打印结果 |
执行没有返回值的表达式时,控制台可能显示执行失败,但调用其实已经执行,这是调试器的已知行为。
看 print 和 NSLog 输出
App 里的 print、NSLog 输出在「输出」面板的 kxapp Console 通道(面板右上角下拉框里选)。真机和模拟器都一样;用「运行(不调试)」启动时输出也会进这里。构建日志在 kxapp Build 通道。
在模拟器上调试运行 SwiftUI 工程时,Console 里会混入大量 Xcode 预览的日志(带 [PreviewsAgentExecutorLibrary]),用输出面板的筛选框过滤出自己的日志即可;「运行(不调试)」没有这些日志。
附加到正在运行的 App
App 已经在设备上运行、想在不重启的情况下调试:在命令面板运行「附加到运行中的 App…」,从「要附加的 App」列表里选(模拟器上显示进程名和 pid,如 HelloKX 54187;真机还会显示 bundle id)。断开后 App 继续运行。
启动参数和环境变量:launch.json
想固定 Scheme、设备,或给 App 传启动参数、环境变量时,在 .vscode/launch.json 里加一条调试类型为 kxapp 的配置:
1{
2 "version": "0.2.0",
3 "configurations": [
4 {
5 "type": "kxapp",
6 "request": "launch",
7 "name": "kxapp: Build & Run(带参数)",
8 "build": true,
9 "args": ["-UITesting"],
10 "env": { "API_BASE_URL": "https://staging.example.com" }
11 }
12 ]
13}
还可以写 scheme、configuration、device(模拟器或设备的 UDID 或名称)。不写时用当前选中的值。完整字段见运行与调试指南。
停止后让 App 继续运行
默认停止调试时会结束 App,和 Xcode 一致。想让 App 留在设备上继续运行,在设置里关掉 kxapp.debug.killAppOnStop。

常见问题
一运行就停在 main 或 UIApplicationMain 是怎么回事?
通常是 App 崩溃或抛出了未捕获的异常,调试器停在了最外层。看左侧调用栈里有没有你自己代码的帧,再看「输出 › kxapp Console」最后几行的报错。想停在异常抛出的位置,在「断点」视图里勾选对应的异常断点(如 Objective-C Throw、Swift Throw)后重新运行。
断点是灰色的,一直不停怎么办?
确认当前用的是 Debug 构建配置,并且这行代码确实会被执行。改了代码后要先按 ⌘. 停止,再按 ⌘R 重新构建;调试工具栏的「重启」不会重新编译。
真机调试第一次特别慢?
手机升级系统后第一次调试,需要先在 Xcode 的「Window › Devices and Simulators」里连一次这台设备,等 Xcode 准备完成。某个 iOS 版本的手机在这台 Mac 上第一次调试时,还会先进行 Preparing device support(复制设备符号,约 1 分钟、占几 GB 磁盘),之后才停到断点;以后再调试十几秒就能停到断点。
调试控制台输入命令没反应?
先确认程序已经停在断点上(继续运行时无法执行表达式)。命令被当成表达式解析时,在前面加一个反引号,例如 `bt,按 lldb 命令执行。