重新整理 .net core 實踐篇 ———— linux上排查問題 [外篇]

前言

簡單介紹一下在排查問題。獻給初學者。

該文的前置篇:

//www.cnblogs.com/aoximin/p/16838657.html

正文

什麼是linux系統

linux 是基於名為procfs的特殊文件系統。

linux 有一句著名的話,一切皆文件。

通常,數據會在啟動時映射到名為 /proc 的裝入點。 proc 文件系統充當內核中內部數據結構的介面。 可以使用該文件獲取有關係統的資訊,並在運行時更改某些內核參數 (sysctl) 。

進程被視為 /proc/ 目錄下的文件。 此目錄在此處定義為特殊目錄:

「此特殊目錄保存有關 Linux 系統的所有詳細資訊,包括其內核、進程和配置參數。

舉個例子,比如你要查看記憶體,你可以使用free。

然後你還可以使用:

cat /proc/meminfo

比如查看cpu資訊:

可以看到我的cpu 是i5 7500,好多年的電腦了,當年也是很好的。

如果要查看進程資訊,這裡隨便找一個進程。

然後進40422這個目錄看一下:

這裡面就是這個進程運行數據:

比如cmdline:

有比如說查看這個進程的環境變數:

最基礎的排查方式

查看記憶體和cpu。

windows 上有任務管理器,那麼linux 也有,就是top。

如果發現這些資訊不能滿足你,可以按f,去選擇自己想要的資訊。

通過空格,選擇自己需要看的資訊。

然後使用man top 查看用法。

top -p xxx 查看某一個進程,然後有個比較好用的是 top -Hp xxx

這個是查看執行緒模式:

可以觀察到執行緒的運行情況。

如果運行太多,可以使用U來查看某個用戶的進程。

top -u root

如果查看正在使用cpu的進程可以使用-i,比如 top -i -u root 這樣查看。

再介紹一個htop,這個是裝13模式。

這逼格是不是加大了,命令和top一樣,不過顏色標明出來了。

注意這一行:

快捷方式做一些常規操作。

核心轉儲

什麼是核心轉儲,核心轉儲就是進程記憶體的快照。

下面是 Linux 系統的行為與核心轉儲文件生成相關的一些關鍵方面:

默認情況下,當進程意外終止時,將生成核心轉儲文件。

核心轉儲文件名為「core」,在當前工作目錄或目錄中 /var/lib/systemd/coredump 創建。

儘管默認行為是作業系統生成核心轉儲文件,但可以覆蓋 /proc/sys/kernel/core_pattern 此設置,將核心轉儲文件輸出直接傳送到另一個應用程式。

那麼生成了核心轉儲服務,有沒有管理的,那肯定是有的,比如apport

捕獲核心轉儲和調試器:

有多種工具可用於捕獲核心轉儲文件,例如 gcore、gdb 和用於分析核心轉儲文件的多個工具,例如 objdump、 kdump、 gdb 和 lldb。

但是,在使用這些工具嘗試執行 .NET 調試時,你會遇到一些重大困難:

與在 Windows 上為 WinDbg 調試器設置符號的過程相比,配置可能很困難。
核心轉儲文件很大,因為這些工具不知道在 .NET Core 進程中使用了哪個記憶體區域,並且無法將記憶體資訊剪裁為僅需要什麼。
轉儲文件不可移植。 必須分析生成這些文件的 Linux 電腦上的轉儲文件。 如果要分析不同 Linux 電腦上的轉儲文件,則需要執行額外的步驟來為調試會話配置主機。

微軟官方推薦:

Lldb 是用於分析 .NET Core 轉儲的建議工具。 .NET SDK 包括用於正確配置 lldb 的有用工具。 但是,必須安裝至少版本 3.9 才能對 .NET Core 執行此類調試分析。

若要安裝 lldb 3.9 或更高版本,請使用包管理器 (,例如: sudo apt install lldb) 。

但是微軟有自己的,比如:
createdump
dotnet-dump
dotnet-gcdump
dotnet-symbol
Procdump

這幾個是需要掌握的,因為內容比較多,所以下一節吧。

下一節介紹:

Lldb
createdump
dotnet-dump
dotnet-gcdump
dotnet-symbol
Procdump