Docker中如何調試剖析.net core 的程序。


前言

  現在.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插件支持哪些命令,下面附上一些資料,以及調試分析的案例和技巧

sos微軟官方命令介紹

通過lldb分析內存案例

案例2

微軟github官方文檔Debugging CoreCLR

 

ps:注意哈:2.0用3.6; 2.1用3.9; 3.0的我還沒試過,,目前項目還是2.1的,等升級了再試試怎么玩。記住哈,版本號一定不能錯,錯了不能用的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM