前言 現在.net core跨平臺了,相信大部分人都把core的程式部署在了linux環境中,或者部署在了docker容器中,與之對應的,之前都是部署在windows環境中,在win中,我們可以用windbg來調試。但是在linux環境下 我們可以採用lldb(這隻是一種,還有其他方式) 環境 li ...
前言
現在.net core跨平臺了,相信大部分人都把core的程式部署在了linux環境中,或者部署在了docker容器中,與之對應的,之前都是部署在windows環境中,在win中,我們可以用windbg來調試。但是在linux環境下
我們可以採用lldb(這隻是一種,還有其他方式)
環境
linux+docker+core2.0
製作基鏡像
為了方便使用lldb,我們最好把他做成鏡像(lldb+dotnet sdk),這樣我們的程式可以以這個製作好的鏡像作為基鏡像來使用。
Dockerfile如下:
# 使用2.0的sdk鏡像 FROM microsoft/dotnet:2.0-sdk RUN apt-get update # 微軟提供的預設鏡像只能通過apt-get來安裝所需要的包,而且還是沒有update過的 # 安裝apt-utils:是為了使用wget命令 # 安裝gdb:是為了抓取指定dotnet進程的dump文件 RUN apt-get update && apt-get install -y apt-utils gdb procps # 安裝lldb,因為.netcore的版本是2.0,所以對應的lldb版本為3.6(如果是2.1的話,就是3.9,註意下麵2處數字處,就是要替換的地方) RUN echo "deb http://llvm.org/apt/trusty/ llvm-toolchain-trusty-3.6 main" | tee /etc/apt/sources.list.d/llvm.list RUN wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | apt-key add - RUN apt-get update RUN apt-get install lldb-3.6 -y
Docker Run
docker run -d --privileged -t 包含lldb和dotnetsdk的基鏡像
這裡要註意的是,容器運行的時候,一定要以特權模式運行,否則執行lldb命令的時候會提示沒有許可權
如何通過lldb attach到你的程式
調試程式有很多種方式,可以attach,可以抓dump分析等,我這裡先舉例,如何attach到上面的容器實例
step1:進入到容器中
docker exec -it 容器id /bin/bash
step2:看下當前這個容器實例的埠號
ps aux | grep dotnet | grep -v gr
找到和你程式同名的那一條記錄,記錄下埠號,比如說AAAA
step3:找到sos插件
find /usr -name libsosplugin.so
記錄下sos插件的路徑,比如說 /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.9/libsosplugin.so
step4:進入lldb命令行
lldb-3.6
step5:載入sos插件
plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.9/libsosplugin.so
step6:附加到當前進程
process attach -p AAAA
至此,你可以使用sos命令來分析你的程式了,你可以執行soshelp來看下當前libsosplugin插件支持哪些命令,下麵附上一些資料,以及調試分析的案例和技巧
ps:註意哈:2.0用3.6; 2.1用3.9; 3.0的我還沒試過,,目前項目還是2.1的,等升級了再試試怎麼玩。記住哈,版本號一定不能錯,錯了不能用的。