跳到主要内容

VS Code 调试 Swift:条件断点、日志断点、查看变量和控制台输出

在 VS Code 里用快蝎插件调试 iOS 应用:设断点、条件断点和日志断点,查看变量、监视和调用栈,在调试控制台用 po、bt,查看 print 输出,附加到运行中的 App,用 launch.json 传启动参数。

在 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 工程,步骤见快速开始。

设断点并开始调试

  1. 在源码行号左侧点一下,出现红点就是断点。Swift、Objective-C、C、C++ 都可以设。
  2. 在状态栏选好 Scheme 和运行目标(模拟器或 iPhone)。
  3. 按 ⌘R(或 F5):插件构建、安装、启动 App,并接上调试器。
  4. 断点命中后用调试工具栏单步:继续(F5)、单步跳过(F10)、单步进入(F11)、单步跳出(⇧F11)。
  5. 按 ⌘. 停止调试。

调试工具栏上的「重启」不会重启 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 命令执行。