• 热门搜索 热门搜索
菜单

您现在的位置是:博客 > 文章详情文章详情

如何使用 vs 2022 远程调试 Linux系统中的Docker容器项目

原创
时间2023/09/11 19:41:55 发布 预览数量853
分类: docker c# .net 标签: Docker C#

一、前言

在项目上,总会遇到一些奇怪的问题,例如:“在本地好好的, 为什么部署到线上就不行” 等等,这样的问题时长困扰着我们。但是作为一个资深的码农,“远程调试” 是一个不可或缺的手段。下面就来看下如果使用 vs 在本地远程调试部署在Linux系统中,运行在Docker容器中的项目吧。

二、远程调试

调试的前提,我们项目的发布方式必须是 Debug,否则是无法进行调试的。具体原因请看 .net 项目发布中的 Debug和Release的区别是什么?

第一步:点击菜单栏中的调试->附加到进程

如何使用 vs 远程调试 Linux系统中的Docker容器项目

第二步:连接类型

如何使用 vs 远程调试 Linux系统中的Docker容器项目

第三步:连接目标

如何使用 vs 远程调试 Linux系统中的Docker容器项目

第四步:连接容器

如何使用 vs 远程调试 Linux系统中的Docker容器项目

第五步:附加到进程

如何使用 vs 远程调试 Linux系统中的Docker容器项目

三、异常信息

按照正常步骤操作,长时间卡在 ’正在启动调试适配器’,之后可能会出现 “未能启动调试适配器。可以在输出窗口中查看额外的信息。无法创建 shell,出现连接错误。Client not connected.” 字样的报错。

如何使用 vs 远程调试 Linux系统中的Docker容器项目

以下内容是控制台输出的信息:

未能启动调试适配器“coreclr”。
无法连接到远程系统或连接丢失。

Client not connected.


初始化日志:
Determining user folder on remote system...
Checking for existing installation of debugging tools...
Downloading debugger launcher...
Creating debugger installation folder: /root/.vs-debugger
Copying debugger launcher to /root/.vs-debugger/GetVsDbg.sh
Ensuring script exists after copying...
Downloading debugger components...
Output: Info: Previous installation at '/root/.vs-debugger/vs2022' not found
Info: Using vsdbg version '17.7.10808.2'
Info: Creating install directory
Using arguments
    Version                    : 'vs2022'
    Location                   : '/root/.vs-debugger/vs2022'
    SkipDownloads              : 'false'
    LaunchVsDbgAfter           : 'false'
    RemoveExistingOnUpgrade    : 'true'
    OfflineMode                : 'true'
Info: Using Runtime ID 'linux-x64'
ERROR: Unable to find 'wget' or 'curl'. Install 'curl' or 'wget'. It is needed to download the vsdbg package.

Downloading debugger binaries from 'https://vsdebugger.azureedge.net/vsdbg-17-7-10808-2/vsdbg-linux-x64.tar.gz'
Copying debugger binaries to '/root/.vs-debugger/vsdbg-linux-x64.tar.gz'
Failed: 无法连接到远程系统或连接丢失。
Launching remote debugger...
Failed: 无法连接到远程系统或连接丢失。
程序“[1] dotnet”已退出,返回值为 4294967295 (0xffffffff)。

从控制台输出的日志不难看出失败的原因是因为需要下载一些调试需要的文件,但是下载文件的地址很多都是外网的,我们国内根本无法访问。

四、解决方式

既然知道了失败的原因,那就好办了。

第一步:下载GetVsDbg.sh

我们先在本地的浏览器中将GetVsDbg.sh文件下载好。GetVsDbg.sh 下载地址:https://aka.ms/getvsdbgsh

第二步:修改 vsdbg-linux-x64 下载地址

GetVsDbg.sh 文件的 download() 方法下的 url 的下载地址改为一个可以下载vsdbg-linux-x64.tar.gz文件的地址(可以自己在本地搭建一个网站,提供文件下载)我在这里提供一个下载地址: https://converts-article-1253184962.cos.ap-chengdu.myqcloud.com/vsdbg-linux-x64.tar.gz (这个地址是本站的静态文件,方便各位方便调用),具体修改如下:

download()
{
    if [ "$__UseZip" = false ]; then
        vsdbgFileExtension=".tar.gz"
    else
        echo "Warning: Version '${__VsDbgMetaVersion}' is only avaliable in zip."
        vsdbgFileExtension=".zip"
    fi
    vsdbgCompressedFile="vsdbg-${__RuntimeID}${vsdbgFileExtension}"
    target="$(echo "${__VsDbgVersion}" | tr '.' '-')"

    # 注释原有的下载地址
    #url="https://vsdebugger.azureedge.net/vsdbg-${target}/${vsdbgCompressedFile}"

    # 替换成新的地址
    url="https://converts-article-1253184962.cos.ap-chengdu.myqcloud.com/vsdbg-linux-x64.tar.gz"

    check_internet_connection "$url"

    echo "Downloading ${url}"
    if hash wget 2>/dev/null; then
        wget -q "$url" -O "$vsdbgCompressedFile"
    elif hash curl 2>/dev/null; then
        curl -s "$url" -o "$vsdbgCompressedFile"
    fi

    if [ $? -ne  0 ]; then
        echo
        echo "ERROR: Could not download ${url}"
        exit 1;
    fi

    __VsdbgCompressedFile=$vsdbgCompressedFile
}

如何使用 vs 远程调试 Linux系统中的Docker容器项目

第三步:创建 .vs-debugger 文件夹
# 创建文件
mkdir /root/.vs-debugger

# 将 GetVsDbg.sh 文件复制进去
mv GetVsDbg.sh /root/.vs-debugger
第四步: 执行 GetVsDbg.sh
/bin/sh "/root/.vs-debugger/GetVsDbg.sh" -v vs2022 -l "/root/.vs-debugger/vs2022" -a "/remote_debugger"

如何使用 vs 远程调试 Linux系统中的Docker容器项目

如上图所示, 我们远程调试需要的依赖包就安装完成了。就是如此简单。下面我们就可以再试试是否可以调试了。

版权声明:本文为Converts的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://www.converts.cn/article/3288901.html

暂无评论

暂无评论

推荐阅读

  • 移除Linux系统启动时的等待时间

    一、前言 VMware 虚拟机中安装了很多Linux 系统,每次启动的时候, 都卡在系统选择的界面上,除非手动选择, 否则要等很久才会进入系统,如下图所示: ![移除Linux系统启动时的等待时间](/ArticleFile/2024-06-24/e3ab02212cc946bd9c23159895177fb3.png '移除Linux系统启动时的等待时间') 二、关闭系统等待的事件 我们

  • GitLab 私有化部署

    一、GitLab 概述 git作为目前最流行的代码管理工具,已经成为了程序员必备的技能。虽然目前有 github(对国人不太友好) 、gitee 两个比较大的代码托管平台。但是出于各种原因,搭建自己的私有代码平台也成了一部分开发人员的选择。针对这种需求,这里为大家介绍的是其中的佼佼者gitlab,也是我们公司内部正在使用的一个代码管理平台。 GitLab是一个基于Git的开源代码管理平台,它

  • 云服务器购买按量付费实例,并搭建私有网络图解

    一、前言 最近在自学 k8s 集群化部署, 奈何云服务器包年包月太贵了, 学习成本飙升。好在各大云服务商支持按量计费 , 接下来就带大家一起过一下购买流程,并且使用私有网络。 二、私有网络 在购买云服务器之前,先了解下什么是私有网络。官网给出的解释是:私有网络(Virtual Private Cloud,VPC)是一块在云服务器上自定义的逻辑隔离网络空间,可以使云服务器, 云数据库资源构建逻

  • Docker 部署FastTunnel,实现内网穿透

    一、前言 最近在学习搭建Elasticsearch集群,但是发现云服务(2核4G)资源根本就不够用,部署上去就直接宕机了。想着服务器资源太贵, 家里刚好有一台64G内存的闲置电脑。不如做一个内网穿透,可以远程访问。工作学习两不误。其实目前市面上已经有很多穿透工具了,比如向日葵~~ ,但是奈何带宽太小了,免费的才1M~~~ 二、什么是 FastTunnel FastTunnel 是用.net

  • IP地址和子网掩码的关系

    一、概述 IP地址(Internet Protocol Address)和子网掩码(Subnet Mask)是计算机网络中两个核心的概念,它们共同工作以确保数据能够正确地在复杂的网络环境中传输到目标设备。 二、IP地址 `IP地址`是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。它是一个32位的二进制数,但是在习惯上,我们

  • 修改Docker默认的存储驱动程序目录

    一、前言 今天使用jenkins对程序进行更新的时候,发现更新失败。经排查是因为系统磁盘满了,然而通过堡垒机看了下,系统空间还有很多,于是看了下系统分区: ![修改Docker默认的存储驱动程序目录](/ArticleFile/2024-06-06/444ede8a1b1b42058db18690fa995952.png '修改Docker默认的存储驱动程序目录') ![修改Docker默认

  • Windows 安装git的详细安装步骤 ,以及TortoiseGit 图形化工具

    一、前言 `Git` 是一个开源的分布式版本控制系统,用于有效、高速地处理从很小到非常大的项目版本管理。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不需要服务器端软件支持。 二、安装Git 1、Git 下载地址 [Git 下载地址](https://git-scm.com/downloads "Git 下载地址") ![Windows

  • 免费的 GIF 录屏工具下载

    一、前言 在写博客或者文档的时候,经常需要附上一些gif动图,可以让快速展示操作流程。下面`小C`就介绍几款我经常用到的几款免费的gif工具。 二、免费的Gif工具 1、GifCam GifCam是一款免费绿色软件,它能够录制屏幕上的动态内容,并将其保存为GIF动画图像。用户可以调整录制区域、帧速率等参数,以满足不同的录制需求。除了连续录制外,GifCam还支持单帧录制功能。用户可以手

  • 对比MySQL不同版本下表结构和数据存储的差异

    一、前言 在开始之前, 我们需要先了解一下 MySQL 的存储引擎有哪些。 `MySQL`常用的存储引擎有 InnoDB 和 MyISAM,而且两者都有各自的特点,适用于不同的场景。下面是对这两种存储引擎的简要对比: - InnoDB存储引擎 - 支持事务处理 - 支持行级锁 - 支持外键约束 - 可以根据事务日志实现数据恢复 - MyISAM存储引擎 - MyISAM 的读取性能

  • Linux系统定时任务 -- crontab命令

    一、前言 有时候需要在 Linux 系统中定时执行一些任务,我们就需要使用 `crontab` 命令创建定时任务。crontab 是“cron table”的缩写,其功能是管理定时计划任务。在Linux系统中的crond是一个定时计划任务服务,用户只要能够按照正确的格式(分、时、日、月、星期、命令)写入到配置文件中,那么就会按照预定的周期时间自动地执行下去,而crontab命令则是用于配置的工具

加载中