编程技巧 --- 远程调试

引言

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

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

image

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

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

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

设置远程调试器

上面说了,设置远程调试器,是最重要的一环,远程调试器是跟随 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

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

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

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

附加进程

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

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

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

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

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

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

image

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

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

posted @ 2024-08-11 23:04  NiueryDiary  阅读(581)  评论(8编辑  收藏  举报