
Apple Silicon M1 Mac VS Code Debug 无法输入问题解决方法
前言
下午的时候朋友问关于 ‘VS Code’ ‘老 Sublime 用户表示真香’ Debug 时如何输入数据的问题,首先在使用 VS Code Debug 之前需要配置,网上的教程杂七杂八的,这里我简要翻译一下微软官方的步骤,以 C++ 为例供参考。
设置 Debug
已设置 Debug 的可以跳过。
事先准备
- 在你的电脑上已经安装了 Visual Studio Code Insiders(为解决 M1 Debug 无法输入的问题直接下载 Insiders 版本)
- 在 VS Code 中安装了 C/C++ 插件
- 确认电脑已安装 Clang
可以使用如下命令在终端中进行确认:
1 | clang --version |
如何提示没有安装,则使用如下命令安装命令行工具:
1 | xcode-select --install |
创建工作区
创建空文件夹并使用 VS Code 打开,并在 File > Add Folder to Workspace… 将其添加至 Workspace:
创建实例文件 helloworld.cpp
并保存:
1 |
|
在 Terminal > Configure Default Build Task 中选择 C/C++: clang++ build active file
,这一步操作会在当前目录下的 .vscode
中创建 task.json
文件,并将其中内容替换为:
1 | { |
编译程序并 Debug
使用快捷键⇧⌘B
或者 **Terminal > Run Build Task **进行编译,之后按 F5 进行 Debug(Mac 功能启用则使用 fn + F5)。这一步会在当前目录下的 .vscode
中创建 launch.json
文件,并将其中内容替换为:
1 | { |
之后再进行 Debug 即可。
一些问题
微软官方指出,在 macOS Catalina 及更新的系统中,用户可能会在 Debug 输入方面遇到问题。可以通过调整 launch.json
中的 externalConsole
为 true
,以弹出终端进行数据的输入。但一部分用户,依然存在问题,一个变通办法就是在 tasks.jsos
中添加如下内容:
1 | { |
微软官方关于这个问题的记录在 GitHub #5079,经过测试 M1 芯片的 VS Code 两种方法都不行。
LLDB
macOS 中默认使用 LLDB(Low Level Debugger)进行 C/C++ 的调试,具体实现方式不展开。VS Code 上有一个插件 CodeLLDB 可以用于在 VS Code 终端中输入信息,安装插件之后,修改 tasks.json
如下:
1 | { |
修改 launch.json
如下:
1 | { |
M1 Mac 在运行 Debug 之后就会报错,应该是架构不统一导致的,简单介绍下背景:
VS Code:x86/arm64
C/C++ 编译器:我不晓得
CodeLLDB:x86,通过 Rosetta 运行
DebugServer: arm64
解决方法
我将罗列几种解决方案,但第一种方案应该就可以满足了:
添加 adapterEnv
Debug x86 时使用 Intel 版本的 VS Code Insiders(在下载按钮的下方)并下载 x86 版本的 CodeLLDB 插件,在 VS Code 设置中搜索 adapterEnv
,并添加如下字段:
1 | "LLDB_DEBUGSERVER_PATH": "/Library/Apple/usr/libexec/oah/debugserver" |
Debug aarch64 比 x86 会稍微复杂一些,首先需要切换 LLDB,在 VS Code 中搜索 lldb.library
并设置相应的动态库位置。CodeLLDB 也提供了根据文件名搜索对应的库,通过 ⇧⌘P
快捷键输入 Use Alternate Backend...
,可以输入动态库文件名帮助搜索。
这里我提供两个路径:
1 | "lldb.library": "/Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/A/LLDB", |
上面的两个路径也可以使用通过 ⇧⌘P
快捷键输入 Use Alternate Backend…
,接着再输入 /usr/bin/lldb
或 /Library/Developer/CommandLineTools/usr/bin/lldb
配置。
在配置完 LLDB 路径之后,创建一个 Shell 脚本如下:
1 | arch -arch arm64e /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/debugserver "$@" |
并使用 chmod +x <脚本名>
赋予权限,并在 VS Code 设置中搜索 adapterEnv
,并添加如下字段:
1 | "LLDB_DEBUGSERVER_PATH": "<上面脚本的路径>" |
换用 Xcode
从源头上解决问题。
换用 VS Code Exploration
VS Code 是有三种版本的,VS Code Exploration 比 Insiders 版本还要快,但我没有找到哪里下载,相关信息也很少。
参考链接
- 感谢您的赞赏