how to use nvim dap to debug cpp
在之前我已经分享过了一份简单的 nvim 配置,它已经实现了编程所需的智能提示,语法高亮,代码跳转等功能,今天我打算整一下 nvim 的调试框架 dap。
dap 是一个框架,客户端负责在 nvim 上显示各种调试信息,比如显示断点、调用栈、对象内存信息等,服务端则提供客户端所需的功能,服务端通常是一个调试器,或者是调试器包装。
本篇会用到 Mason 这个插件去安装 dap 的服务端,本篇不会展开 Mason,将来有机会详细说一下。
首先先看几张正常工作的图:
运行界面
查看变量信息
快捷键
函数调用栈
安装 dap
在 Mason 的安装列表中添加上 codelldb,codelldb 是 vscode 用的调试服务端,负责给 vscode 提供调试信息,有了这个后端,我们就可以方便的实现和 vscode 相同的调试功能。
配置 dap
在 plugins 目录下新建 _dap.lua
文件。
1 |
|
有些人会在 packer 里用 use 安装,把 return 改成 use 就可以了。
packer 的代码已经写好了,现在写 config 函数,在我的例子中,我把文件放在了 lua/config/dap/
目录下,因为要配置不同的语言,这样会方便管理一些。
首先要先在 dap 目录下新建一个 init.lua,这里是模块入口,初始化的工作从这里开始。
1 |
|
在 _dap.lua
中调用了 require("config.dap").setup()
,这个 setup 函数就是 config/dap/init.lua
中的 M.setup()
函数。
目前只是写了一个壳子,现在让我们正式配置它吧。
快捷键
在 nvim 中进行调试,界面显然还是在终端里的,所以我们要使用快捷键进行一些操作,比如标记断点、单步进入、跳出等。
在 config/dap/keymaps.lua
中进行快捷键的配置。
1 |
|
在这里我将快捷键绑定在了 <leader> d
上面。
现在返回到 init.lua
中,在 setup
函数中调用 keymaps。
1 |
|
dapui
dapui 是一个美化 dap 界面的插件,通常大家都会配置的吧!
1 |
|
配置基本上大家都没差多少,说不定都是从一个人的配置里搬运的。
配置 icon
我还修改了几个默认的 icon,在 configure 函数里。
1 |
|
断点标记
单步停止
配置客户端
现在还差一个客户端的函数没有写,在这里只是为了调用针对不同语言设置的服务端,内容也非常的简单。
新建一个 config/dap/cpp.lua
,在里面配置 c++ 相关的参数就行了,需要注意的是,codelldb 可以调试 c、c++、rust 等语言,就不会再拆分成更精细的文件了。
1 |
|
Mason 在这里终于露面了,但是我们只是看到查找了 Mason 安装 codelldb 的路径而已。
配置的内容是固定的,设置一下执行文件的路径和参数,设置一下调试这个语言所需的启动参数,这里默认给了一个输入可执行文件路径启动调试的简单方法。
配置 launch.json
上面的内容就已经足够调试 c++ 程序了,但是 dap 还支持 vscode 的 launch.json,将启动配置作为固定模板填入启动调试的列表,并且在 launch.json 中我们还可以控制程序的环境变量,启动参数等,会比较方便一些。
dap 支持这个只需要在 setup 函数加上一行代码就足够了。
1 |
|
这句话的意思是 launch.json 中的类型是 codelldb 时,使用 c、cpp、rust 的调试配置,而上面我们配置了 codelldb 的参数 和 cpp 的参数,而且还将 cpp 的配置复制给了 c 和 rust。
但是有一个需要注意的地方,launch.json 现在环境变量换成了 environment 字段,并且结构也发生了变化,dap 目前只支持 env 字段,我在考虑贡献一个 pr 做一个自动转换。
这里给一个 launch.json 的例子:
1 |
|
需要注意的是,这里的 codelldb 其实是一个标识字符串,vscode 默认提供的 type 是 cppgdb,我们也可以改成相同的字段。
想要在线查看最终文件内容,可以看下面几个链接: