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的,等升级了再试试怎么玩。记住哈,版本号一定不能错,错了不能用的。
最新文章
- SQL Server-数据库架构和对象、定义数据完整性(二)
- java画图之曲线拖动
- jquery插件学习之元素顶部悬浮
- android 手机屏幕有关的几个工具(屏幕宽高,dp和px互相转换)
- Geolocation API 原理及方法
- 转一篇Unity客户端与Java服务器的通信
- mysql 如何用一条SQL将一张表里的数据插入到另一张表 3个例子
- unity update 和fixedudpate
- [Effective JavaScript 笔记]第65条:不要在计算时阻塞事件队列
- Liferay7 BPM门户开发之26: 集成Activiti到Liferay7
- PAT天梯赛练习题 L2-013 红色警报(并查集+逆序加边)
- Hadoop学习(2)-- HDFS
- 双系统修改启动项顺序&;&;&;修改开机启动等待时间
- IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)(转载)
- linux中grep和egrep的用法
- 【Android】退出运行了多个Activity的应用
- iOS开发——Localizable.strings
- NodeJS 入门第二天(EJS模板)
- Java DB 访问之(四) spring mvc 组合mybatis
- BZOJ_2393_Cirno的完美算数教室&;&;BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理