zoukankan      html  css  js  c++  java
  • 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的,等升级了再试试怎么玩。记住哈,版本号一定不能错,错了不能用的。

  • 相关阅读:
    vue this触发事件
    jQuery获取地址栏中的链接参数
    vue 省市区三级联动
    图片文字css小知识点
    sticky footer 模板
    Django学习——用户自定义models问题解决
    Django学习——全局templates引用的问题
    Django的学习——全局的static和templates的使用
    selenium登录爬取知乎出现:请求异常请升级客户端后重试的问题(用Python中的selenium接管chrome)
    使用python远程连接数据库
  • 原文地址:https://www.cnblogs.com/eastpig/p/11711892.html
Copyright © 2011-2022 走看看