从零开始配置vim(29)——DAP 配置

news2025/7/22 16:13:57

首先给大家说一声抱歉,前段时间一直在忙换工作的事,包括但不限于交接、背面试题准备面试。好在最终找到了工作,也顺利入职了。期间也有朋友在催更,在这里我对关注本系列的朋友表示感谢。多的就不说了,我们正式进入vim 的配置吧

上一节通过配置 python 的调试环境,我们大概了解了配置 dap 的基本步骤。首先需要一个 dap 的客户端负责在编辑器上显示各种调试信息,并且与用户进行交互。然后需要一个服务端,与客户端通信并完成调试的实际步骤。然后需要配置两个东西, dap.adapters 用来配置如何启动调试器,dap.configurations用来配置如何将当前项目加载到调试器上。

本篇我们进一步配置 dap。让它变得更好用,并且介绍编译型语言(C/C++)调试的配置。

优化界面

回顾一下上一篇中在演示图片里面看到的效果。默认界面在断点位置以 B 来标识,当前运行的代码以 -> 来标识。看起来不那么的直观,我们先对它进行优化,我们采用 Visual Code 的调试图标来进行标识

我们采用以下代码进行配置

local dap_breakpoint_color = {
    breakpoint = {
        ctermbg=0,
        fg='#993939',
        bg='#31353f',
    },
    logpoing = {
        ctermbg=0,
        fg='#61afef',
        bg='#31353f',
    },
    stopped = {
        ctermbg=0,
        fg='#98c379',
        bg='#31353f'
    },
}

vim.api.nvim_set_hl(0, 'DapBreakpoint', dap_breakpoint_color.breakpoint)
vim.api.nvim_set_hl(0, 'DapLogPoint', dap_breakpoint_color.logpoing)
vim.api.nvim_set_hl(0, 'DapStopped', dap_breakpoint_color.stopped)

local dap_breakpoint = {
    error = {
        text = "",
        texthl = "DapBreakpoint",
        linehl = "DapBreakpoint",
        numhl = "DapBreakpoint",
    },
    condition = {
        text = 'ﳁ',
        texthl = 'DapBreakpoint',
        linehl = 'DapBreakpoint',
        numhl = 'DapBreakpoint',
    },
    rejected = {
        text = "",
        texthl = "DapBreakpint",
        linehl = "DapBreakpoint",
        numhl = "DapBreakpoint",
    },
    logpoint = {
        text = '',
        texthl = 'DapLogPoint',
        linehl = 'DapLogPoint',
        numhl = 'DapLogPoint',
    },
    stopped = {
        text = '',
        texthl = 'DapStopped',
        linehl = 'DapStopped',
        numhl = 'DapStopped',
    },
}

vim.fn.sign_define('DapBreakpoint', dap_breakpoint.error)
vim.fn.sign_define('DapBreakpointCondition', dap_breakpoint.condition)
vim.fn.sign_define('DapBreakpointRejected', dap_breakpoint.rejected)
vim.fn.sign_define('DapLogPoint', dap_breakpoint.logpoint)
vim.fn.sign_define('DapStopped', dap_breakpoint.stopped)

上面的代码主要配置了显示的颜色和图标。最终调试的效果如下图所示
在这里插入图片描述
然后我们需要提供一个可用的界面用来显示调试过程中的各种信息,包括变量值和调用栈。完成这个工作的是插件 nvim-dap-ui 。我们使用如下的代码进行安装

use { "rcarriga/nvim-dap-ui", requires = {"mfussenegger/nvim-dap"} }

这个插件里面包装了很多调试相关的窗口,例如变量监控、调用栈等等。我们可以对他进行配置,让这些窗口元素出现在我们希望它出现的位置。为了加载这个插件我们还是按照之前的惯例,为它准备一个单独的配置文件,并且加载它。

local dapui = require("dapui")
dapui.setup({})

我们可以使用该插件中的函数 toggle() 开打开或者关闭这些调试窗口。最终的效果就像这样
在这里插入图片描述
每次都输入这个函数来打开和关闭调试窗口比较麻烦,因此我们这里可以使用以下代码来实现自动加载和关闭

local dapui = require("dapui")
dapui.setup({})

local dap = require("dap")
dap.listeners.after.event_initialized["dapui_config"] = function()
    dapui.open({})
end

dap.listeners.before.event_terminated["dapui_config"] = function()
    dapui.close({})
end


dap.listeners.before.event_exited["dapui_config"] = function()
    dapui.close({})
end

这段代码在 dap 的事件中注册了几个回调函数,当对应的事件发生时会调用对应的函数,我们在 dap 的调试启动时打开调试窗口,在结束时关闭调试窗口
在这里插入图片描述
最后关于界面方面的优化再来推荐一个插件——nvim-dap-virtual-text 它的作用是在调试过程中,在变量附近事实显示变量的值。我们可以在 dap-ui 的配置文件中对他进行配置

require("nvim-dap-virtual-text").setup({
    enabled = true,
    enable_commands = true,
    highlight_changed_variables = true,
    highlight_new_as_changed = false,
    show_stop_reason = true,
    commented = false,
    only_first_definition = true,
    all_references = false,
    filter_references_pattern = '<module',
    virt_text_pos = 'eol',
    all_frames = false,
    virt_lines = false,
    virt_text_win_col = nil
})

上述的配置是官方给出的,我原封不动的复制过来了。它的效果如下图所示:
在这里插入图片描述

配置c++基础调试环境

终于到了本文最重要的环节了,就是配置 c/c++ 的调试环境,上一篇我们讲解了 Python 的配置,它代表了脚本类解释型语言的调试配置,C/C++ 代表了编译型语言的调试配置。

针对 C/C++ 的调试我们选用 cpptools 作为 dap 的服务端。首先通过 MasonInstall cpptools 来下载安装它,也可以通过 :Mason 命令在图形化的界面上进行安装。

然后我们还是按照之前的顺序来对他进行配置,首先配置它的加载方式

local dap = require("dap")

dap.adapters.cppdbg = {
    id = "cppdbg",
    type = 'executable',
    command = "~/.local/share/nvim/mason/bin/OpenDebugAD7",
}

这里我们设置它以 executable 的方式启动(在客户端调试时启动)。然后指定可执行程序的路径,如果这里报找不到 OpenDebugAD7 这种错误,可以将 ~ 改为 /home/user 这样的具体目录。

然后我们配置一下客户端与服务器通信相关的内容

dap.configurations.cpp = {
    {
        name = "Launch file",
        type = "cppdbg",
        request = "launch",
        program = function()
            return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. "/", "file")
        end,

        cwd = "${workspaceFolder}",
        stopAtEntry = true,
    },
}
dap.configurations.c = dap.configurations.cpp

最后我们通过一个 dap.configurations.c= dap.configurations.cppc++c使用同一个配置。因为 C/C++ 是编译运行的,在调试的时候其实调试的是它生成的可执行程序,所以这里每次在调试的时候需要手工指定要调试的可执行程序。最后别忘了在 ftplugin/cpp.lua 中加载它

另外需要注意,因为可执行程序运行时是不依赖源代码的,但是调试的时候想让调试器能够准确的知道当前在源码的位置并且能够显示当前变量的值,这个时候需要在可执行程序中打包符号表,对于linuxC/C++ 程序来说,只需要在编译的时候给gcc/g++ 传递 -s 参数即可。

我们写一个简单的 C程序来进行实验

#include <stdio.h>

int main (int argc, char *argv[])
{
    printf("hello world\n");
    for (size_t i = 0; i < 10; i++) {
        printf("i = %ld\n", i);
    }
    return 0;
}

在这里插入图片描述
注意: 这里我们使用的调试器仍然是gdb, cpptools 只是在上层进行了一层封装。因此这里能调试的前提是安装了gdb 调试器

到此我们将关于 dap 调试的部分都基本介绍完了。其实 dap 也并没有想象中那么难,目前从安装到配置使用,都有大量的插件来方便我们使用,而且官网上基本都有配置的介绍,没有特殊需求只需要将标准配置原样拷贝粘贴即可。下一篇我们将补充一些关于 dap 的其他内容,并介绍 neovim + gdb 的组合,敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【案例 5-1】 模拟订单号生成

【案例介绍】 1.任务描述 编写一个程序&#xff0c;模拟订单系统中订单号的生成。例如给定一个包括年月日以及毫秒值的 数组 arr{2019,0504,1101},将其拼接成字符串 s:[201905041101]。要求使用 String 类常用方 法来实现字符串的拼接。 2.运行结果 运行结果如图 5-1 所示 图…

【SRE】Linux加入AD域控

老牌企业一般因为安全要求或者历史遗留要求&#xff0c;会要求服务器加入AD域控 RHEL/CentOS/Ubuntu 加入 Windows ldap 域控 网上有各种各样的方法&#xff0c;很多复杂且模糊&#xff0c;操作到一大半发现没法推进&#xff0c;这个是亲测最好用的办法 使用pbis-open使Linux服…

关于Ubuntu ssh远程连接报错和无法root登录的解决方法

一、使用远程工具连接Ubuntu提示报错 MobaXterm v22.0 版本直接可以远程连接上&#xff08;前提是sshd服务是开启的状态&#xff09; 注意&#xff1a;须使用最新版本或较高版本的ssh远程连接工具&#xff0c;进行ssh连接&#xff1b;若使用较低版本的ssh远程连接工具&#xf…

MySQL产生死锁原因

阅读目录锁类型介绍死锁产生原因和示例1、产生原因2、产生示例案例一案例二案例三案例四案例五案例六锁类型介绍 MySQL 有三种锁的级别&#xff1a;页级、表级、行级 1 表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁定粒度大&#xff0c…

正则表达式(常用最新版)

密码 【1】密码必须为包含大小写字母和数字的组合&#xff0c;不能使用特殊字符&#xff0c;长度在6-10之间。 /^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{6,10}$/ 【2】密码必须为包含大小写字母和数字的组合&#xff0c;可以使用特殊字符&#xff0c;长度在6-10之间。 /^(?.*[a-z]…

【快速上手系列】百度富文本编辑器的快速上手和简单使用

【快速上手系列】百度富文本编辑器的快速上手和简单使用 使用步骤 1、首先要把demo下载下来 demo链接&#xff1a; (18条消息) 百度富文本编辑器demo-Javascript文档类资源-CSDN文库 index.html&#xff1a;demo中的测试页面&#xff0c;可以看到很多方法使用 2、新建一个we…

【freeRTOS】操作系统之二-队列

在任何RTOS中&#xff0c;都具有一个重要的通信机制----消息队列。 ​ 队列是任务间通信的主要形式。**它们可用于在任务之间、中断和任务之间发送消息。**在大多数情况下&#xff0c;它们被用作线程安全的FIFO(先进先出)缓冲区&#xff0c;新数据被发送到队列的后面&#xff…

OpenCV图像处理——傅里叶变换

总目录 图像处理总目录←点击这里 十三、傅里叶变换 13.1、原理 我们生活在时间的世界中&#xff0c;早上7:00起来吃早饭&#xff0c;8:00去挤地铁&#xff0c;9:00开始上班。。。 以时间为参照就是时域分析。在频域中一切都是静止的 对傅里叶变换写的很好的一篇文章→ h…

【C++】队列来喽,真的很简单的

我们经历了那么多练习和顺序表&#xff0c;链表&#xff0c;栈的大风大浪&#xff0c;小小一个队列可以说简单至极了 练习&#xff0c;以及顺序表之类的文章都在我的主页哦&#xff0c;请认真学习之后再看本文 目录 1.队列的结构 2.实现 3.栈和队列的相互实现 1.队列的结构 …

Postgresql源码(88)column definition list语义解析流程分析

0 总结 如果调用函数时同时满足以下几种情况 在from后面。返回值为RECORD&#xff08;或者是anyelement表示的RECORD&#xff09;&#xff08;anyelement的实际类型由入参决定&#xff0c;入参是RECORD&#xff0c;返回就是RECORD&#xff09;。返回值被判定为TYPEFUNC_RECOR…

11.18 - 每日一题 - 408

每日一句&#xff1a;不如就利用孤单一人的时间&#xff0c;使自己变得更优秀&#xff0c;给来的人一个惊喜&#xff0c;也给自己一个好的交代 数据结构 1 当一棵有n个结点的二叉树按层次从上到下&#xff0c;同层次从左到右将结点中的数据存放在一维数组A[1…n&#xff3d;中…

Android App事件交互Event之模仿京东App实现下拉刷新功能(附源码 可直接使用)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、正常下拉与下拉刷新的冲突处理 电商App的首页通常都支持下拉刷新&#xff0c;比如京东首页的头部轮播图一直顶到系统的状态栏&#xff0c;并且页面下拉到顶后&#xff0c;继续下拉会拉出带有下拉刷新字样的布局&#x…

leaflet教程039: 只显示一屏地图,设定范围不让循环延展

第039个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet只显示一屏地图,并且根据maxBounds和bounds的设定,来改变不同的地图呈现状态。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共68行)心得总结相…

[附源码]java毕业设计期刊在线投稿平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

小程序基础原理

前言 本文会围绕小程序的基础原理进行介绍。主要包括小程序的基础结构、编译、加载、通讯等几个方面。旨在阅读完毕后可以对小程序有一个基本的印象。 一、基础 对于用户来讲&#xff0c;小程序无需下载、用完即走、体验良好。 对于开发者来讲&#xff0c;小程序主要是区别…

同花顺_代码解析_技术指标_M

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 MACD MACDFS MARSI MASS MAVOL MCL MCO MFI MI MICD MIKE MTM MTMFS MACD 指数平滑异同平均线 MACD指标说明 MACD指数平滑异同移动平均线为两条长、短的平滑平均线。 其…

拉取多CPU架构容器镜像推送到其他仓库

一、背景 一个docker镜像可能会有多种CPU架构的变体&#xff0c;有时需要把这些多架构的镜像全部从公共镜像库&#xff08;如&#xff1a; hub.docker.com &#xff09;同步到自建的库上。 二、解决方法 使用 docker buildx 多架构打包机制&#xff0c;进行重制推送&#xf…

Bean 作用域和生命周期

一 : Bean的默认作用域 Bean 默认情况下是单例状态(singleton),所有人使用的都是同一个对象.举例理解Bean的单例状态 : 假设现在有一个公共的 Bean&#xff0c;提供给 A 用户和 B 用户使用&#xff0c;然而在使用的途中 A 用户却“悄悄”地修 改了公共 Bean 的数据&#xff0…

[附源码]SSM计算机毕业设计中医药系统论文2022JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

快速清除PPT缓存文件或C盘隐藏大文件

是否遇到过电脑的磁盘空间越来越满&#xff0c; 请注意这些临时文件可谓是C盘的存储杀手&#xff0c;无形中吞噬掉很多磁盘空间&#xff0c;这里以PPT为例&#xff1a; C:\Users\Admin\AppData\Roaming\Microsoft\PowerPoint\ 1.首先在PPT2019软件中&#xff0c;打开一个PPT文…