引言 最近在做的項目上做了一些性能優化的工作,用到了 Visual Studio 遠程調試,所以本篇文章整理一下遠程調試技巧。 首先,瞭解一下 Visual Studio遠程調試是什麼? Visual Studio 的遠程調試功能允許在本地調試遠程電腦上運行的應用程式。用遠程調試,可以在本地電腦 ...
引言
最近在做的項目上做了一些性能優化的工作,用到了 Visual Studio
遠程調試,所以本篇文章整理一下遠程調試技巧。
首先,瞭解一下 Visual Studio遠程調試是什麼?
Visual Studio
的遠程調試功能允許在本地調試遠程電腦上運行的應用程式。用遠程調試,可以在本地電腦上設置斷點、查看變數和監視程式執行,能更輕鬆地診斷和解決問題。
其次 ,遠程調試能夠做什麼?
這對於調試在不同環境中運行的應用程式非常有用,例如在生產伺服器上或是在其他設備上,可以更高效地解決問題並提高開發效率。
對於調試同一環境下有進程間通信的的多個進程,也非常有用。
那麼,接下來實踐一下遠程調試。
遠程調試實操
那麼,接下來就實操一下遠程調試,首先,你需要做一些準備工作:
- 你得有一臺需要遠程的電腦或伺服器,另一臺開發環境的電腦,該電腦
Visual Studio
這個是必須安裝的,無論是Community
、Professional
或Enterprise
,均支持。 - 要遠程調試的電腦與
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
一下看一下本機的信息:
確認代碼無問題後,將該解決方案以Debug發佈,生成Debug文件夾,這裡一定記住需要使用Debug發佈,遠程調試需要使用到Debug發佈生成的 .pdb
文件[2],具體.pdb
文件,後面的章節解釋。
將生成的生成Debug文件夾,拷貝或發佈到需要遠程的電腦或伺服器上
設置遠程調試器
上面說了,設置遠程調試器,是最重要的一環,遠程調試器是跟隨 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盤的共用,可以直接使用。
接下來啟動遠程調試器(msvsmon.exe
)並設置[3],這裡有兩個點需要註意:
- 第一,需要以管理員許可權啟動
msvsmon.exe
。 - 第二,啟動後需要在 工具->選項 中設置埠號和身份驗證。
- 這裡預設埠是 4026,建議身份驗證設為無身份驗證時,一定勾選允許任何用戶進行調試。
此時,遠程調試調試的所有準備工作就都準備完了。
附加進程
此時,如想要遠程調試程式,就需要在 Visula Studio
對遠程電腦或伺服器的程式進行附加進程。
遠程調試的進入路徑,實際上還是通過附加進程的方式,那麼附加進程又能做什麼呢?
Visual Studio
的附加進程功能允許開發人員將調試器附加到運行中的外部進程,以便在不中斷程式執行的情況下對其進行調試。通過附加進程,可以監視外部進程的運行狀態、查看變數和調用堆棧,以便診斷問題和進行性能優化。
這對於調試與應用程式交互的其他進程或第三方組件非常有用。附加進程功能可以幫助我們更全面地瞭解應用程式在運行時的行為,從而快速解決問題並改進代碼。
那麼,現在啟動遠程電腦或伺服器的測試程式。切換到開發環境的電腦使用 Visula Studio
進行附加進程,在調試->附加到進程,打開附加到進程界面,需要做如下四點設置:
- 連接類型選擇-遠程(windows - 無身份驗證)。
- 連接目標選擇遠程的目標電腦或伺服器IP地址+遠程調試器設置的埠號,預設為4026。
- 選擇你要調試的目標進程。
- 勾選顯示所有用戶的進程,防止找不到目標進程。
選中目標進程後,確認附加,就可以進行遠程調試了。從下圖可以看到,輸出了目標目標電腦或伺服器的電腦基本信息。
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
作者: Niuery Daily
出處: https://www.cnblogs.com/pandefu/>
關於作者:.Net Framework,.Net Core ,WindowsForm,WPF ,控制項庫,多線程
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出 原文鏈接,否則保留追究法律責任的權利。 如有問題, 可郵件咨詢。