首页 > 编程语言 >编程技巧 --- 远程调试

编程技巧 --- 远程调试

时间:2024-08-11 23:06:53浏览次数:13  
标签:编程 AppendLine --- Studio sb 远程 调试 调试器

引言

最近在做的项目上做了一些性能优化的工作,用到了 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

标签:编程,AppendLine,---,Studio,sb,远程,调试,调试器
From: https://www.cnblogs.com/pandefu/p/18354081

相关文章

  • swagger-api生成接口文档
    引入swagger-api生成接口文档1.引入pom依赖<!--swagger2依赖--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version&......
  • AI Python for Beginners-Andrew吴恩达-study notes(2)
    1Introduction    itisbelievedthatwiththehelpofAIchatbotwecanlearnpythonmoreeasilyanditwillbeamazingtoautomatetasksusingPython2 CompletingatasklistwithAI2.1List①listisasinglevariableoftype thatholdsm......
  • 34.x86游戏实战-XXX过检测代码分析
    免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!本次游戏没法给内容参考于:微尘网络安全工具下载:链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3提取码:6tw3复制这段内容后打开百度网盘手机App,操作更方便哦上一个内容:33.x86游戏实战-喊话C......
  • 基于Java的考试信息报名系统 SpringBoot考试报名管理系统 Vue前后端分离【Java毕业设
    ⛄博主介绍:⚡全栈开发工程师,精通Web前后端技术、数据库、架构设计。专注于Java技术领域和小程序领域的开发,毕业设计、课程设计项目中主要包括定制化开发、源代码、代码讲解、文档报告辅导、安装调试等。✅文末获取联系✅目录1项目介绍 2技术选型 3系统总体设计 4......
  • D - Square Pair
    原题链接题解多想几种暴力1.遍历所有数对:\(O(n^2)\)2.求有多少数对其乘积为平方数\(\to\)求有多少平方数能被数对乘积:\(O(n^2)\)3.如果两个数的乘积为平方数,代表他们的质因数,要么都是奇数,要么都是偶数:\(O(?)\)4.如果\(a\timesb\)是完全平方数,代表\(a\timesb\)......
  • 信息安全-信息安全运营(安全监控与审计 漏洞管理)
    https://mp.weixin.qq.com/s/E-0_-vExLLV4NklaIQYaHQ信息安全-信息安全运营(安全监控与审计漏洞管理)原创被摧残的IT人生被摧残的IT人生2024年07月25日09:00广东本期看点前期已发布并完结IT建设之路(专业技术篇),包括“企业IT管理”、“IT技术架构”、“信息安全”、“应用架......
  • chinese-clip中的文本编码模型RoBERTa
    RoBERTa(ARobustlyOptimizedBERTApproach)是BERT模型的一个改进版本,由FacebookAIResearch团队在2019年提出。RoBERTa在BERT的基础上,通过调整训练策略和数据量,大幅提高了模型的性能。RoBERTa的特点大规模训练数据:RoBERTa使用了更大规模的数据集进行训练,包括Boo......
  • 人工智能算法工程师(高级)课程11-自然语言处理之NLP的语言模型-seq2seq模型,seq+注意
    大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程11-自然语言处理之NLP的语言模型-seq2seq模型,seq+注意力,word2vec与代码详解。本课程面向高级人工智能算法工程师,深入讲解自然语言处理(NLP)中的关键语言模型技术,包括seq2seq模型及其增强版加入注意力机制......
  • haproxy负载均衡之-调度算法详解
    HAProxy的调度算法分为静态调度算法、动态调度算法和其他调度算法静态算法:按照事先定义好的规则轮询公平调度,不关⼼后端服务器的当前负载、链接数和响应速度等,且⽆法实时修改权重,只能靠重启HAProxy⽣效。动态算法:基于后端服务器状态进⾏调度适当调整,⽐如优先调度⾄当前负载较......
  • 34 -realloc()函数
    文章目录1函数原型2参数3返回值4示例1函数原型realloc():重新分配内存块,函数原型如下:void*realloc(void*ptr,size_tsize);cstdlib库描述如下:Reallocatememoryblock1.Changesthesizeofthememoryblockpointedtobyptr.2.Thefunctionmay......