使用 lldb 分析 Dotnet 核心傾印檔案

查詢服務資訊

使用 journalctl 查詢服務 Log

1
2
journalctl -r --identifier=[服務的identifier] --since "2 minute ago"
journalctl -r -u [服務名稱] --since "2 day ago"

取得系統產生的傾印檔案

安裝 apport

1
sudo apt install apport

進入目錄 /var/crash 搜尋核心傾印檔案,之後使用 apport 解壓縮

1
apport-unpack [核心傾印檔案].crash [解壓縮目錄]

使用 ProcDump 產生傾印檔案

安裝 ProcDump

1
sudo apt install procdump

產生傾印檔案至服務工作目錄

1
sudo procdump [服務PID]

當目標進程 CPU 或記憶體使用量達到特定臨界值或低於限制值時

1
sudo procdump -c [CPU使用率] -m [記憶體使用MB數] [服務PID]

當目標進程收到特定訊號時

1
sudo procdump -sig [Linux 信號] [服務PID]

安裝相關 Dotnet 工具加強 lldb 偵錯

安裝 dotnet-symbol 導出傾印檔案的符號

1
dotnet tool install -g dotnet-symbol

導出傾印檔案的符號

1
dotnet-symbol ~/dumps/dotnet/CoreDump -o ~/dumps/symbols --host-only

安裝 SOS 擴充偵錯工具功能

1
2
dotnet tool install -g dotnet-sos
dotnet-sos install

使用 lldb 偵錯

安裝 lldb

1
sudo apt-get install lldb

使用 lldb 分析核心傾印檔案

1
lldb --core ~/dumps/dotnet/CoreDump

在 lldb 中載入導入傾印檔案的符號

1
setsymbolserver -directory ~/dumps/symbols

在 lldb 中常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
語法資訊: help
附加至進程: process attach -p [PID]
建立中斷點: bpmd [dll檔案] [命名空間].[class名稱].[方法]
列出中斷點: bpmd -list
程序繼續: process continue
程序暫停: process interrupt
執行緒清單: clrthreads
切換執行序: thread select [thread]
執行緒池資訊: threadpool
列印所有緒線程棧: eestack
線程棧清單: clrstack
顯示IP方法資訊: ip2md [IP]
顯示MethodDesc資訊: dumpmd [MethodDesc]
執行緒鎖定資訊: syncblk
顯示GC狀態: eeheap -gc
顯示GC世代: dumpgen [gen0、gen1、gen2、loh、poh]
檢查GC堆積毀損狀態: verifyheap
列印所有託管堆物件(dso): dumpstackobjects
託管堆狀態: dumpheap -stat -min [資料Byte]
尋找託管堆的位址: dumpheap -mt [MT]
程序最近都拋了什麼異常: dumpheap -type Exception
異常狀況資訊(pe): printexception
異常的詳細信息: printexception [address]
分析物件位置(do): dumpobj [address]
檢查物件毀損狀態: verifyobj
分析陣列位置(da): dumparray [address]