1. 简介
  2. 使用 Clang 编译
  3. 使用 VC++ 编译
  4. 结语

使用 Visual Studio Code 调试 FIBJS

简介

FIBJS 在不同平台上都可以支持使用 clang 编译, 并且在 Posix 系统下推荐使用 clang, 不过在 Windows 环境下默认使用 VC++ 编译.
本文以 Windows 环境为例, 介绍如何在 Visual Studio Code 中,

  • 使用 VSC 的扩展 codeLLDB 调试使用 clang 编译的 Debug 版 FIBJS
  • 使用 VSC 自带的 Windows C++ Debugger 调试使用 VC++ 编译的 Debug 版 FIBJS

使用 Clang 编译

参考 官方的环境安装指南 , 确保你本地有:

  • Visual Studio 2019 (With C++)
  • Clang/LLVM >= 10, 可以从 LLVM 官方网站下载安装
    • 确保 clang.exe, lldb.exe 等命令在全局 PATH 中
  • Git Bash, 从 Git 官方网站下载 Git 安装, 并启用 Git Bash
  • Visual Studio Code 中安装扩展 CodeLLDB

在本文中, 我们会在 Visual Studio Code 的集成式终端下使用 Git Bash, 你可以参考这篇文章将你的 Git Bash 集成到 Visual Studio Code 中

LLVM 版本需要 >= 9, 这里推荐 10
Windows 下需要 Git Bash, 其它系统可使用自带的 Bash
Visual Studio Code 中安装 CodeLLDB 扩展

做好准备工作后, cd 到你 fibjs 项目下. 通过项目目录下的 ./build 脚本来编译. 如果你感兴趣, 可以运行 ./build --help 来了解其支持的选项:

  • release / debug: 指定编译类型, 默认为 release
  • i386/amd64/arm/arm64/mips/mips64/ppc/ppc64: 指定编译结果要支持的目标架构, 默认与当前系统的架构一致. 比如在 Windows 64bit 上是 amd64,在 macOS intel 上是 amd64, 在 macOS M1 上是 arm64
  • clean:会清理掉本地的 cpp 编译 out 目录和 bin 目录
  • -j:指定编译时要使用的 CPU 核心数量. 默认为当前 {CPU 核心数的 * 4}
  • --use-clang: 仅对 Windows 有意义, 强制使用 clang 来编译

执行 ./build debug -j24 --use-clang 以开始编译 Debug 版本的 fibjs:

编译会耗一定的时间, CPU 的核心数和线程数越多编译越快, 我们可以去接杯水, 并放一首张敬轩的《断点》, 然后等待编译完成. 编译好之后你可以得到类似于右图的结果:

在 Windows 上, 若不指定 --use-clang, 则默认会使用 VC++ 编译
执行一下 fibjs -v 看看编译的版本

编译好后, 即可使用 Visual Studio Code 来调试 Debug 版本的 fibjs. 在项目下添加 .vscode/launch.json 文件, 并写入一下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug FIBJS",
"program": "${workspaceFolder}/bin/Windows_amd64_debug/fibjs",
"args": [
"${workspaceFolder}/test"
],
"cwd": "${workspaceFolder}",
"windows": {
"program": "${workspaceFolder}/bin/Windows_amd64_debug/fibjs.exe"
},
"linux": {
"program": "${workspaceFolder}/bin/Linux_amd64_debug/fibjs"
},
"osx": {
"program": "${workspaceFolder}/bin/Darwin_amd64_debug/fibjs"
},
}
]
}

注意, 确保你的 Visual Studio Code 已经安装 CodeLLDB 扩展, 检查一下在之前的准备工作阶段你是否安装它. 然后我们就可以开始使用 lldb 来调试:

  1. 在 Visual Studio Code 中, 打开 program/src/fibjs.cpp, 在 33 行旁边加一个 breakpoint, 启动调试
  2. 在 VSC 侧边栏中切换到 Debug 工具, 在调试栏上点击我们通过 .vscode/launch.json 定义的 “Debug FIBJS”
launch.json 中可以通过 windows/linux/osx 字段来指定在不同系统下的特定参数
打在这里, 是因为这是 Windows 版 FIBJS 启动的必经之路


该调试动作相当于在 LLDB 上下文下执行 ./bin/Windows_amd64_debug/fibjs ./test, 由于我们在 fibjs 程序启动的必经之路上打了个断点, 所以 Visual Studio Code 会在此处停下:

可以看到, 执行到断点时, fibjs 已经启动了 7 个线程

使用 VC++ 编译

在 Windows 上, 我们也可以单独使用 VC++ 编译. 参考 官方的环境安装指南, 确保你本地有:

  • Visual Studio 2019

我们将使用 VS 提供的开发者终端 (Developer Command Prompt) 来编译

在 Prompt 中 cd 到 fibjs 项目目录下. 我们将使用 .\build.cmd 脚本来编译. 如果你感兴趣, 可以运行 .\build.cmd --help 来了解其支持的选项:

这里的各个选项和上文中提到的 Bash 版本的 ./build 是一致的, 不再赘述.

执行 .\build.cmd debug 以开始编译 Debug 版本的 fibjs. 编译会耗费一定的时间. 编译好之后你可以得到类似于下面右图的结果:

编译开始
编译结果

接下来, 我们就可以调试这个编译好的 VC++/debug 版 fibjs. 这里我们使用 Visual Studio Code 自带的 Windows Debugger 来调试的方法.

在项目下添加 .vscode/launch.json 文件, 并写入一下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"configurations": [
{
"type": "cppvsdbg",
"request": "launch",
"name": "Debug FIBJS",
"program": "${workspaceFolder}/bin/Windows_amd64_debug/fibjs",
"args": [
"${workspaceFolder}/test"
],
"cwd": "${workspaceFolder}",
"windows": {
"program": "${workspaceFolder}/bin/Windows_amd64_debug/fibjs.exe"
},
"linux": {
"program": "${workspaceFolder}/bin/Linux_amd64_debug/fibjs"
},
"osx": {
"program": "${workspaceFolder}/bin/Darwin_amd64_debug/fibjs"
},
}
]
}

和上面使用 lldb 调试时, 仅有区别就是 "type": "cppvsdbg"

  1. 在 Visual Studio Code 中, 打开 program/src/fibjs.cpp, 在 33 行旁边加一个 breakpoint, 启动调试,
  2. 在 VSC 侧边栏中切换到 Debug 工具, 在调试栏上点击我们通过 .vscode/launch.json 定义的 “Debug FIBJS”
launch.json 中可以通过 windows/linux/osx 字段来指定在不同系统下的特定参数
打在这里, 是因为这是 Windows 版 FIBJS 启动的必经之路

该调试动作相当于在 VSC 自带的 cpp debugger 上下文下执行 .\bin\Windows_amd64_debug\fibjs.exe .\test , 由于我们在 fibjs 程序启动的必经之路上打了个断点, 所以 Visual Studio Code 会在此处停下:

结语

总结一些注意点:

  • 要调试 fibjs, 需要编译为 Debug 版本, 否则无法通过断点来调试
  • 我们可以使用 Visual Studio Code 自带的 C++ Debugger 来调试, 也可以使用 LLVM 工具集里面的 lldb 来调试.
  • LLDB 不仅可以调试 clang 编译的 fibjs, 也可以编译 VC++ 编译的 fibjs.
  • 在 Windows 上使用编译时, 在基于 VC++ 编译时, 如果没有特别的目的, 我们不必指定 -j 选项. 由于 VC++ 编译是由 msbuild 驱动, 其默认即开启了动态并行编译, msbuild 会自动根据系统的 CPU 资源, 平衡好分配给 VC++ 编译的资源和系统中其它任务的资源.

在 macOS/Linux 环境下, 可以参考 Windows 环境下的调试, 我们同样可以通过 Visual Studio Code + lldb 的组合来调使用 clang 编译的 Debug 版 fibjs, 它们的原理是一样的.

首页归档简历