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插件支持哪些命令,下面附上一些资料,以及调试分析的案例和技巧
ps:注意哈:2.0用3.6; 2.1用3.9; 3.0的我还没试过,,目前项目还是2.1的,等升级了再试试怎么玩。记住哈,版本号一定不能错,错了不能用的。
推荐阅读
-
Docker中如何调试剖析.net core 的程序。
-
4. abp中的asp.net core模块剖析
-
浅谈如何在ASP.NET Core中实现一个基础的身份认证
-
ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用
-
03 .NET CORE 2.2 使用OCELOT -- Docker中的Consul
-
详解Win10 Bash/WSL调试Linux环境下的.NET Core应用程序
-
如何在Asp.Net Core MVC中处理null值的实现
-
15.ASP.NET Core 应用程序中的静态文件中间件
-
docker发布.net core程序的坑
-
如何使用pm2守护你的.NET Core应用程序详解