首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

编程技巧 --- 远程调试

编程知识
2024年08月11日 22:04

引言

最近在做的项目上做了一些性能优化的工作,用到了 Visual Studio 远程调试,所以本篇文章整理一下远程调试技巧。

首先,了解一下 Visual Studio远程调试是什么?

remote-debugger-client-apps.png

Visual Studio 的远程调试功能允许在本地调试远程计算机上运行的应用程序。用远程调试,可以在本地计算机上设置断点、查看变量和监视程序执行,能更轻松地诊断和解决问题。

其次 ,远程调试能够做什么?

这对于调试在不同环境中运行的应用程序非常有用,例如在生产服务器上或是在其他设备上,可以更高效地解决问题并提高开发效率。

对于调试同一环境下有进程间通信的的多个进程,也非常有用。

那么,接下来实践一下远程调试。

远程调试实操

那么,接下来就实操一下远程调试,首先,你需要做一些准备工作:

  • 你得有一台需要远程的计算机或服务器,另一台开发环境的电脑,该电脑Visual Studio 这个是必须安装的,无论是 CommunityProfessionalEnterprise,均支持。
  • 要远程调试的计算机与 Visual Studio 计算机必须通过网络(有线/无线)或通过以太网电缆直接连接的方式连接在一起。 不支持在通过代理连接的两台计算机之间进行调试。 也不建议通过高延迟或低带宽连接的情况下连接,否则可能会导致调试失败或速度过慢。
  • 设置远程调试器[1],这是最重要的一环,远程调试器是跟随 Visula Studio 安装时一同安装的,若要远程调试的计算机安装了 Visula Studio, 可以直接找到他启动,若要远程的调试的计算机是纯净环境,那么可以通过设置文件共享[1],将本机的远程调试器共享以便调试,另外如果要远程调试的计算机是服务器,你需要经常进行这样的远程调试,则可以将远程调试器配置为服务[1]。

测试代码

这里我们写一段简单的控制台测试代码,输出当前电脑的基本信息:

using System;
using System.Management;
using System.Text;

class Program
{
    static void Main()
    {
        //回车后开始输出,便于等待远程调试接入
        Console.ReadLine();

        StringBuilder sb = new StringBuilder();

        sb.AppendLine("计算机基本信息:\n");

        // 获取操作系统信息
        sb.AppendLine("操作系统信息:");
        var osQuery = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
        foreach (var os in osQuery.Get())
        {
            sb.AppendLine($"名称: {os["Caption"]}");
            sb.AppendLine($"版本: {os["Version"]}");
            sb.AppendLine($"制造商: {os["Manufacturer"]}");
            sb.AppendLine($"计算机名: {os["CSName"]}");
        }

        sb.AppendLine();

        // 获取处理器信息
        sb.AppendLine("处理器信息:");
        var cpuQuery = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");
        foreach (var cpu in cpuQuery.Get())
        {
            sb.AppendLine($"名称: {cpu["Name"]}");
            sb.AppendLine($"制造商: {cpu["Manufacturer"]}");
            sb.AppendLine($"描述: {cpu["Description"]}");
        }

        sb.AppendLine();

        // 获取内存信息
        sb.AppendLine("内存信息:");
        var memQuery = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMemory");
        foreach (var mem in memQuery.Get())
        {
            sb.AppendLine($"容量: {Math.Round(Convert.ToDouble(mem["Capacity"]) / (1024 * 1024 * 1024), 2)} GB");
            sb.AppendLine($"速度: {mem["Speed"]} MHz");
        }

        var str= sb.ToString();

        Console.Write(str);

        Console.ReadLine();
    }
}

然后在本机 Debug 一下看一下本机的信息:

image.png

确认代码无问题后,将该解决方案以Debug发布,生成Debug文件夹,这里一定记住需要使用Debug发布,远程调试需要使用到Debug发布生成的 .pdb 文件[2],具体.pdb 文件,后面的章节解释。

将生成的生成Debug文件夹,拷贝或发布到需要远程的计算机或服务器上
image.png

设置远程调试器

上面说了,设置远程调试器,是最重要的一环,远程调试器是跟随 Visula Studio 安装时一同安装的,若要远程调试的计算机安装了 Visula Studio, 可以直接找到它启动,在与你的 Visual Studio 版本匹配的目录中找到 msvsmon.exe ,比如我的是 Visula Studio 2022 ,则我的目录为 :

  • C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\Remote Debugger\x64msvsmon.exe
  • C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\Remote Debugger\x86\msvsmon.exe

但是,一般我们都不会在发布计算机或者服务器上安装调试环境,所以还有第二种方式,以文件共享的方式,将当前开发环境电脑的远程调试器共享给发布计算机或者服务器。具体如何设置共享文件夹就不在这里赘述了,我这里使用 MobaXterm 远程过去后自动添加了C盘的共享,可以直接使用。

image.png

接下来启动远程调试器(msvsmon.exe)并设置[3],这里有两个点需要注意:

  • 第一,需要以管理员权限启动 msvsmon.exe
  • 第二,启动后需要在 工具->选项 中设置端口号和身份验证。
  • 这里默认端口是 4026,建议身份验证设为武神分验证时,一定勾选允许任何用户进行调试。

image.png

此时,远程调试调试的所有准备工作就都准备完了。

附加进程

此时,如想要远程调试程序,就需要在 Visula Studio 对远程计算机或服务器的程序进行附加进程。

远程调试的进入路径,实际上还是通过附加进程的方式,那么附加进程又能做什么呢?

Visual Studio 的附加进程功能允许开发人员将调试器附加到运行中的外部进程,以便在不中断程序执行的情况下对其进行调试。通过附加进程,可以监视外部进程的运行状态、查看变量和调用堆栈,以便诊断问题和进行性能优化。

这对于调试与应用程序交互的其他进程或第三方组件非常有用。附加进程功能可以帮助我们更全面地了解应用程序在运行时的行为,从而快速解决问题并改进代码。

那么,现在启动远程计算机或服务器的测试程序。切换到开发环境的电脑使用 Visula Studio 进行附加进程,在调试->附加到进程,打开附加到进程界面,需要做如下四点设置:

  • 连接类型选择-远程(windows - 无身份验证)。
  • 连接目标选择远程的目标计算机或服务器IP地址+远程调试器设置的端口号,默认为4026。
  • 选择你要调试的目标进程。
  • 勾选显示所有用户的进程,防止找不到目标进程。

image.png
选中目标进城后,确认附加,就可以进行远程调试了。从下图可以看到,输出了目标目标计算机或服务器的电脑基本信息。

image.png

pdb文件

为什么远程调试中,一定要以Debug发布呢?因为只有在Debug发布,才会生成 .pdb 文件。
那么什么是 .pdb 文件?

程序数据库 ( .pdb) 文件(也称为符号文件)将项目源代码中的标识符和语句映射到已编译应用中的相应标识符和说明。 这些映射文件将调试器链接到源代码,以进行调试。

.pdb 文件保存调试和项目状态信息,使用这些信息可以对应用的调试配置进行增量链接。 在调试时,Visual Studio 调试器使用 .pdb 文件来确定两项关键信息:

  • 要在 Visual Studio IDE 中显示的源文件名和行号。
  • 在应用中停止的断点位置。

调试器只会加载与在生成应用时创建的 .pdb 文件完全匹配的 .pdb 文件(即原始 .pdb 文件或副本),所以只有Debug发布生成的 .pdb 文件才能与你当前的代码完全映射,进而进行调试。

总结

远程调试作为一种调试技巧,除了能够在在本地环境中调试不同操作系统或远程服务器上的代码外,还能够通过多人共享远程调试会话,协助解决问题和优化代码,促进团队协作,在 解决远程服务器上的问题,无需下载整个代码库,无需安装调试环境,简化问题排查流程,高效地解决问题,是一项非常实用,高效的技能。

参考链接

[1] Visual studio (windows)远程调试 ---
https://learn.microsoft.com/zh-cn/visualstudio/debugger/remote-debugging?view=vs-2022

[2] 调试程序中的符号(.pdb)和源文件 --- https://learn.microsoft.com/zh-cn/visualstudio/debugger/specify-symbol-dot-pdb-and-source-files-in-the-visual-studio-debugger?view=vs-2022

[3] 远程调试c#项目 --- https://learn.microsoft.com/zh-cn/visualstudio/debugger/remote-debugging-csharp?view=vs-2022

From:https://www.cnblogs.com/pandefu/p/18354081
本文地址: http://shuzixingkong.net/article/996
0评论
提交 加载更多评论
其他文章 在python项目的docker镜像里使用pdm管理依赖
前言 在 DjangoStarter 项目中,我已经使用 pdm 作为默认的包管理器,不再直接使用 pip 所以部署的时候 dockerfile 和 docker-compose 配置也得修改一下。 dockerfile 首先修改一下 dockerfile ARG PYTHON_BASE=3.11
Android网页投屏控制从入门到放弃
本文主要记录通过网页控制安卓设备相关的实践过程,通过从adb方案开始,到uiautomator2,以及最后放弃scrpy方案,在这个热闹的周末,正好闲暇的时间,了解过去不曾接触的知识,也是一个有趣的过程。
Android网页投屏控制从入门到放弃
痞子衡嵌入式:探析i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题(上篇)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题探析。 前段时间有一个 RT1052 客户反馈了一个有趣的问题,他们设计得是一个带 LCD 屏交互的应用,应用以官方 SDK 里的 lvgl_demo_widget
痞子衡嵌入式:探析i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题(上篇) 痞子衡嵌入式:探析i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题(上篇) 痞子衡嵌入式:探析i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题(上篇)
排列组合:公式及推导
排列组合:公式及推导 引入 定义: 排列:从指定个数的元素中取出指定个数的元素进行排序;(考虑元素的顺序) 组合:从给定个数的元素中仅仅取出指定个数的元素;(不考虑元素的顺序) 加法&乘法原理 加法原理: 完成一个工程可以有 \(n\) 类办法, \(a_i(i\in[1,n])\) 代表第
排列组合:公式及推导 排列组合:公式及推导 排列组合:公式及推导
关于REACT范式的一些思考
关于REACT范式的一些思考 REACT范式经过近一年的探索,让我们在很多领域有了非常广泛的应用,它确实提升了很多之前无法解决的问题,比如大模型虽然在语言理解和交互式决策方面在任务中表现出令人印象深刻的表现,但是如何让模型基于解释来使用 LLMs 以交错方式生成推理跟踪和特定于任务的操作 一直是一个
关于REACT范式的一些思考 关于REACT范式的一些思考 关于REACT范式的一些思考
Java类和对象 小白版
一、类 一、类的定义 具有同种属性的对象称为类。定义了它所包含的全体对象的公共特征和功能,对象就是类的一个实例化。 类的三种常见成员:属性、方法、构造器 二、类的编写 1.类名的定义; 2.类属性(特性)的编写;属性 ( 成员变量 ) = 访问修饰符 + 数据类型 +变量名 //定义人类 publi
下一代浏览器和移动自动化测试框架:WebdriverIO
1、介绍 今天给大家推荐一款基于Node.js编写且号称下一代浏览器和移动自动化测试框架:WebdriverIO 简单来讲:WebdriverIO 是一个开源的自动化测试框架,它允许测试人员使用 Node.js 编写自动化测试脚本,用于测试Web应用、移动应用和桌面应用程序。能够执行端到端(e2e)
下一代浏览器和移动自动化测试框架:WebdriverIO
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
教程简介 EasySQLite是一个七天.NET 8操作SQLite入门到实战详细教程(包含选型、开发、发布、部署)! 什么是SQLite? SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。S
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署) 七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署) 七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)