前言

  现在.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的,等升级了再试试怎么玩。记住哈,版本号一定不能错,错了不能用的。

最新文章

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

热门文章

  1. Java生鲜电商平台-IntelliJ IDEA 最新注册码,亲测可用
  2. 网站的favicon图标
  3. 微信语音短消息amr文件转WAV
  4. HOW TO: Setting up Encrypted Communications Channels in Oracle Databas
  5. USB通信协议深入理解
  6. centos7下关闭防火墙
  7. 201271050130-滕江南-《面向对象程序设计(java)》第十三周学习总结
  8. 工具资源系列之 github 上各式各样的小徽章从何而来?
  9. ini_set()
  10. vue.js 使用 v-text 和 v-html