文章

Zed Debugger | 如何在 Zed 编辑器中调试 C/C++

Zed Debugger | 如何在 Zed 编辑器中调试 C/C++

前些天分享了一些关于 Zed 编辑器的配置,有评论提到 Zed 文档中 debug 相关配置的介绍有些简陋。虽然当时在评论中已经说的差不多了,但为了更便于检索,还是将其拎出来,独成一文,也希望能给尝试使用 Zed Debugger 的朋友一些帮助。

一些基本操作

在 Zed 编辑器中,按 F4,它会弹出一个弹框,如果是尚未配置 Debugger 的项目,弹框像下面这样:

f4-1

然后,可以点击 Launcher,可以选择/配置要使用的 Debugger,要调试的目标程序 Program 以及是否在入口处停下等。

f4-2

Windows

这里只以 LLDB 为例,当然你也可以安装 MinGW 然后尝试一下 GDB

按照前面的步骤,你应该会得到如下一个配置。

1
2
3
4
5
6
7
8
9
10
[
  {
    "label": "Debug Windows - LLDB",
    "cwd": "D:\\OpenSource\\yanggang\\zed-debugger",
    "program": "test.exe",
    "request": "launch",
    "adapter": "CodeLLDB",
    "stopOnEntry": false
  }
]

具体的调试

如果你已经生成了待调试的目标程序 test.exe,那么可以在某一行设下断点,然后按 F4,选择 Debug Windows - LLDB,Zed 编辑器会自动下载并启动 CodeLLDB 并加载 test.exe,然后开始调试。

codelldb-win

在左侧上部的按钮可以用来 Continue/StepIn/StepOut 等,Frames 则显示当前的调用栈,Breakpoints 中可以看到设置的断点信息。

debugger-l

在中间的 Console 中可以使用调试器的命令,Variables 中则显示了当前的变量及寄存器信息。

debugger-m

而右侧的 Terminal 中则是目标程序执行到当前断点的输出内容。

调试前编译

如果把编译和调试放到两个流程/环境,似乎有些笨拙,所以你可以将 build 流程放在 debug.json 中,这样就可以一键完成编译然后接着调试了。

可以像这样将 build 流程全部放在 debug.json 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[
  {
    "label": "Debug Windows MSVC",
    "cwd": "D:\\OpenSource\\yanggang\\zed-debugger",
    "program": "test.exe",
    "request": "launch",
    "adapter": "CodeLLDB",
    "stopOnEntry": false,
    "build": {
      "command": "cmd.exe",
      "args": [
        "/c",
        "call build.bat"
      ]
    }
  }
]

也可以单独新建一个 .zed/tasks.json

1
2
3
4
5
6
[
  {
    "label": "Debug Build",
    "command": "cmd.exe /c call build.bat"
  }
]

然后在 debug.json 中只需要添加一行 "build": "Debug Build" 即可(Debug Build 对应 tasks.json 中的 label)。 这样的好处是可以单独只做 build(F4->Run->Debug Build)。

Linux

整体的配置几乎没什么差别,主要是两种平台 build 命令的不同,以及 LLDBGDB 的部分配置区别。 下面便直接贴出来具体的配置,需要的朋友参考即可。

LLDB

1
2
3
4
5
6
7
8
9
10
11
12
    {
        "label": "Debug Linux CodeLLDB",
        "program": "$ZED_WORKTREE_ROOT/test",
        "request": "launch",
        "adapter": "CodeLLDB",
        "stopOnEntry": false,
        "build": {
            "command": "gcc",
            "args": ["-g", "test.c", "-o", "test"],
            "cwd": "$ZED_WORKTREE_ROOT"
        }
    },

GDB

1
2
3
4
5
6
7
8
9
10
11
12
13
    {
        "label": "Debug Linux GDB",
        "adapter": "GDB",
        "request": "launch",
        "program": "test",
        "stopAtBeginningOfMainSubprogram": true,
        "cwd": "$ZED_WORKTREE_ROOT",
        "build": {
            "command": "gcc",
            "args": ["-g", "test.c", "-o", "test"],
            "cwd": "$ZED_WORKTREE_ROOT"
        }
    },

怎么用一个特定版本的 LLDB

当前 Zed 与最新版本的 CodeLLDB 似乎有些适配上的问题,所以如果想要使用特定版本的 CodeLLDB 可以在 settings.json 中按照如下配置:

1
2
3
4
5
6
7
8
9
10
  "dap": {
    "CodeLLDB": {
      // "env": {
      //   "LLDB_USE_NATIVE_PDB_READER": "1"
      // },
      // "binary": "D:\\clang-llvm\\bin\\lldb-dap.exe",
      "binary": "D:\\codelldb-1-11-4\\extension\\adapter\\codelldb.exe"
      // "args": ["--wait-for-debugger"]
    }
  },

官方文档中有提到 "args",但似乎并不必要,尤其是在用 CodeLLDB 时。 另外也可以使用 LLVM 官方的 lldb-dap,不过似乎还有些兼容性问题,后续相关问题修复后 Zed 也许会默认使用官方 lldb-dap

本文由作者按照 CC BY 4.0 进行授权