利用SOS擴充套件庫進入高階.NET6程式的除錯

語言: CN / TW / HK

有時候我們可能想深入到程式的執行核心,去觀察下記憶體分配情況以及堆疊內儲存的東東,那麼作為程式設計新貴的底層框架.NET6,又為我們提供了什麼可用的觀測工具呢?

1.SOS 擴充套件是什麼?

SOS擴充套件庫是Windows 附帶的除錯擴充套件庫,它允許開發人員在 WinDbg、CDB 或 NTSD 中除錯託管程式碼,請記住,當您執行託管二進位制檔案時,執行時會生成特定於平臺的本機程式碼,而SOS 擴充套件允許您以“託管方式”除錯本機程式碼。

最最主要的是,SOS 除錯擴充套件允許您檢視有關在** .NET Core 執行時**執行的程式碼的資訊,包括實時程序和轉儲檔案。

2. SOS支援跨平臺嗎?

是的,sos已經有mac、liunx和windows上的各個版本,它們支援不同的核心核心,可以用到不同的平臺上進行擴充套件除錯。

3.如何開始使用SOS?

sos擴充套件必須附加到別的除錯工具上,因此其並不能獨立執行。

為了除錯.net 6程式,我們分別在不同的平臺使用不同的工具進行演示。

3.1 Linux平臺上使用LLDB工具

第一步是安裝偵錯程式LLDB。LLDB 與 WinDbg 非常相似,也是 SOS 團隊一直在使用的偵錯程式,因此我採用它作為 Linux 的預設偵錯程式。

您可以從以下連結安裝 LLDB:

https://lldb.llvm.org/download.html

或者您也可以通過執行以下命令來安裝它:

yum install lldb

在 Linux 機器上安裝 lldb 後,開啟終端 並通過在提示符下鍵入以下命令來啟動偵錯程式:

lldb

如果 lldb 已正確啟動,您將獲得如下所示的 lldb 提示。

3.2 Linux 平臺安裝sos

沒有sos擴充套件的加持,你是無法除錯.NET程式的,因此還需要安裝sos擴充套件。目前dotnet提供了簡易安裝方式,我們只需要錄入下列命令即可。

dotnet tool install --global dotnet-sos
dotnet-sos install

預設安裝的sos是和你cpu架構一致的版本,如果你需要其他版本,可以指定引數進行安裝。

引數有下列值可用。

  • Arm

  • Arm64

  • X86

  • X64

例如:

dotnet-sos install --architecture Arm

在Linux系統中安裝完sos後,再次啟動LLDB,會預設載入sos擴充套件的。

3.3 利用LLDB除錯程式

先啟動.net 程式,然後利用ps查詢程序號。

ps -ef | grep dotnet

然後啟動lldb

lldb

在lldb命令介面內鍵入附加程序命令:

process attach -p 31339

附加dotnet程式程序到分析空間。

Process 31339 stopped
Executable module set to “/tmp/dotnet/bin/Debug/net5.0/dotnet”.
Architecture set to: x86_64–linux-gnu.

一旦附加到 lldb後,就可以顯示執行緒列表。

您可以執行使用 bt 命令來檢索當前執行緒的呼叫堆疊,但是很難除錯它,因為您無法以“託管方式”檢視堆疊.

為了測試,讓我們執行 clrstack 命令,現在我們可以更好地瞭解正在發生的事情。

我們還可以執行其他 SOS 命令(如 clrThreads) 來找出所有管理執行緒,為此我們輸入:

sos clrThreads

如果您想自己嘗試其他 SOS 命令,它們會列在 . NET 框架文件

希望這對你有用!

3.4 Windows上除錯的支援

還可以通過將 SOS 除錯擴充套件載入到 WinDbg/dbg 除錯程式中並在 Windows 除錯程式中執行命令來使用此擴充套件。可對實時程序或轉儲使用 SOS 命令。

歡迎嘗試Windbg 預覽版【微軟商店】,千年不變的介面終於煥然一新。

安裝sos依然是這些命令:

dotnet tool install --global dotnet-sos 
dotnet-sos install

安裝後,可以在windbg內載入它

. Load %userprofile%\.Dotnet\SOS\sos.dll

然後在工作管理員中找到這個程序,儲存dump檔案到臨時目錄,利用windbg開啟,並載入sos.dll.

!clrstack -a

當然你可以根據需要鍵入不同的除錯命令進行跟蹤分析。

!runaway
!threadpool
!continue
!syncblk

4. 小結

高階除錯是不是把你學fei了?