利用SOS扩展库进入高阶.NET6程序的调试
有時(shí)候我們可能想深入到程序的運(yùn)行核心,去觀察下內(nèi)存分配情況以及堆棧內(nèi)保存的東東,那么作為編程新貴的底層框架.NET6,又為我們提供了什么可用的觀測工具呢?
1.SOS 擴(kuò)展是什么?
SOS擴(kuò)展庫是Windows 附帶的調(diào)試擴(kuò)展庫,它允許開發(fā)人員在 WinDbg、CDB 或 NTSD 中調(diào)試托管代碼,請記住,當(dāng)您執(zhí)行托管二進(jìn)制文件時(shí),運(yùn)行時(shí)會生成特定于平臺的本機(jī)代碼,而SOS 擴(kuò)展允許您以“托管方式”調(diào)試本機(jī)代碼。
最最主要的是,SOS 調(diào)試擴(kuò)展允許您查看有關(guān)在** .NET Core 運(yùn)行時(shí)**運(yùn)行的代碼的信息,包括實(shí)時(shí)進(jìn)程和轉(zhuǎn)儲文件。
2. SOS支持跨平臺嗎?
是的,sos已經(jīng)有mac、liunx和windows上的各個(gè)版本,它們支持不同的內(nèi)核核心,可以用到不同的平臺上進(jìn)行擴(kuò)展調(diào)試。
3.如何開始使用SOS?
sos擴(kuò)展必須附加到別的調(diào)試工具上,因此其并不能獨(dú)立運(yùn)行。
為了調(diào)試.net 6程序,我們分別在不同的平臺使用不同的工具進(jìn)行演示。
3.1 Linux平臺上使用LLDB工具
第一步是安裝調(diào)試器LLDB。LLDB 與 WinDbg 非常相似,也是 SOS 團(tuán)隊(duì)一直在使用的調(diào)試器,因此我采用它作為 Linux 的默認(rèn)調(diào)試器。
您可以從以下鏈接安裝 LLDB:
https://lldb.llvm.org/download.html
或者您也可以通過運(yùn)行以下命令來安裝它:
yum install lldb
在 Linux 機(jī)器上安裝 lldb 后,打開終端 并通過在提示符下鍵入以下命令來啟動調(diào)試器:
lldb
如果 lldb 已正確啟動,您將獲得如下所示的 lldb 提示。
3.2 Linux 平臺安裝sos
沒有sos擴(kuò)展的加持,你是無法調(diào)試.NET程序的,因此還需要安裝sos擴(kuò)展。目前dotnet提供了簡易安裝方式,我們只需要錄入下列命令即可。
dotnet tool install --global dotnet-sos dotnet-sos install默認(rèn)安裝的sos是和你cpu架構(gòu)一致的版本,如果你需要其他版本,可以指定參數(shù)進(jìn)行安裝。
參數(shù)有下列值可用。
Arm
Arm64
X86
X64
例如:
dotnet-sos install --architecture Arm在Linux系統(tǒng)中安裝完sos后,再次啟動LLDB,會默認(rèn)加載sos擴(kuò)展的。
3.3 利用LLDB調(diào)試程序
先啟動.net 程序,然后利用ps查找進(jìn)程號。
ps -ef | grep dotnet然后啟動lldb
lldb在lldb命令界面內(nèi)鍵入附加進(jìn)程命令:
process attach -p 31339附加dotnet程序進(jìn)程到分析空間。
Process 31339 stopped
Executable module set to “/tmp/dotnet/bin/Debug/net5.0/dotnet”.
Architecture set to: x86_64–linux-gnu.
一旦附加到 lldb后,就可以顯示線程列表。
您可以運(yùn)行使用bt命令來檢索當(dāng)前線程的調(diào)用堆棧,但是很難調(diào)試它,因?yàn)槟鸁o法以“托管方式”查看堆棧.
為了測試,讓我們運(yùn)行clrstack命令,現(xiàn)在我們可以更好地了解正在發(fā)生的事情。
我們還可以運(yùn)行其他 SOS 命令(如clrThreads)?來找出所有管理線程,為此我們輸入:
sos clrThreads
如果您想自己嘗試其他 SOS 命令,它們會列在 .?NET 框架文檔
希望這對你有用!
3.4 Windows上調(diào)試的支持
還可以通過將 SOS 調(diào)試擴(kuò)展加載到 WinDbg/dbg 調(diào)試程序中并在 Windows 調(diào)試程序中執(zhí)行命令來使用此擴(kuò)展。可對實(shí)時(shí)進(jìn)程或轉(zhuǎn)儲使用 SOS 命令。
歡迎嘗試Windbg 預(yù)覽版【微軟商店】,千年不變的界面終于煥然一新。
安裝sos依然是這些命令:
安裝后,可以在windbg內(nèi)加載它
. Load %userprofile%\.Dotnet\SOS\sos.dll然后在任務(wù)管理器中找到這個(gè)進(jìn)程,保存dump文件到臨時(shí)目錄,利用windbg打開,并加載sos.dll.
!clrstack -a當(dāng)然你可以根據(jù)需要鍵入不同的調(diào)試命令進(jìn)行跟蹤分析。
!runaway !threadpool !continue !syncblk4. 小結(jié)
高階調(diào)試是不是把你學(xué)fei了?恩,學(xué)這個(gè)跟下篇文章有些瓜葛,因此不得不先介紹下調(diào)試器的使用。
👓都看到這了,還在乎點(diǎn)個(gè)贊嗎?
👓都點(diǎn)贊了,還在乎一個(gè)收藏嗎?
👓都收藏了,還在乎一個(gè)評論嗎?
總結(jié)
以上是生活随笔為你收集整理的利用SOS扩展库进入高阶.NET6程序的调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于事件驱动架构构建微服务第13部分:使
- 下一篇: 秘境探索之一个.NET 对象从内存分配到