前言

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

Docker中如何调试剖析.net core 的程序。的更多相关文章

  1. 如果在docker中部署tomcat,并且部署java应用程序

    1.先说如何在docker中部署tomcat 第一步:root用户登录在系统根目录下创建文件夹tomcat7,命令如:mkdir tomcat7,并且切换到该目录下:cd tomcat7: 第二步:创 ...

  2. 在 Docker 中手工部署 ASP.NET Core 应用

    另一篇:在 Visual Studio 中部署 ASP.NET Core 应用  操作步骤 1. 安装 Docker For Windows(安装之前 Windows 需要开启 Hyper-V 虚拟机 ...

  3. 在docker中运行ASP.NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

  4. docker中运行ASP.NET Core Web API

    在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...

  5. 使用 Docker 在 Linux 上托管 ASP.NET Core 应用程序

    说在前面 在阅读本文之前,您必须对 Docker 的中涉及的基本概念以及常见命令有一定了解,本文侧重实战,不会对相关概念详述. 同时请确保您本地开发机器已完成如下安装: Docker 18.06 或更 ...

  6. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  7. VS code docker 调试 asp.net core

    前言 .net core的诞生就是为了解决跨平台的事情的,所以.net core app运行在linux.macOS.docker上也不是什么新鲜事了. 相信已经有不少.net core的项目已经部署 ...

  8. ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

    本文简要说一下ASP.NET Core 在Docker中部署以及docker-compose的使用  (ASP.NET Core 系列目录). 系统环境为CentOS 8 . 打个广告,求职中.. 一 ...

  9. 附加进程 到远程服务器中Docker容器内 调试

    很多时候,我们在本地开发过程中程序运行很正常,但是发布到线上之后由于环境的原因,可能会有一些异常.通常我们会通过日志来分析问题,除了日志还有一种常用的调试手段就是:附加进程. VS中的附加进程非常强大 ...

随机推荐

  1. 学习Swoole需要掌握哪些基础知识

    多进程/多线程 了解Linux操作系统进程和线程的概念 了解Linux进程/线程切换调度的基本知识 了解进程间通信的基本知识,如管道.UnixSocket.消息队列.共享内存 SOCKET 了解SOC ...

  2. Java生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案

    Java生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案 说明:Java开源生鲜电商中OMS订单系统中并发问题和锁机制的探讨与解决方案: 问题由来     假设在一个订单系统中(以火车票 ...

  3. jQuery之概念以及基本使用

    1. jQuery的概述 1.1 jQuery的概念 jQuery是一个快速.简洁的JavaScript库,其设计的宗旨是“Write Less,Do More” jQuery主要是封装了JavaSc ...

  4. Django和前端用ajax传输json等数据

    需要传输的是下图中所有的input中客户端设置的数据 整个页面是用js生成,代码不长,但是用了许多拼接,看起来开比较乱,页面的核心就是下面的部分,有一些关键参数部分就不放了,可以跳过这个 下面开始重点 ...

  5. stl标准库 iterator_traits

    为什么标准库里要有traits? 我们先回忆一下,标准库提供的算法的一些特征: 参数一般包括iterator. 要根据iterator的种类,和iterator包装的元素的类型等信息,来决定使用最优化 ...

  6. js 时间戳转yyyy-MM-dd HH-mm-ss工具类

    转载自:https://blog.csdn.net/shan1774965666/article/details/55049819 在web开发中,我们经常需要用js将时间戳转yyyy-MM-dd H ...

  7. ora-01489 字符串连接的结果过长 解决方案

    如下代码,使用listagg进行分组拼接时,常常会报 ora-01489 错误,造成该报错的主要原因是:oracle对字符变量的长度限制,正常情况下,oracle定义的varchar2类型变量的长度不 ...

  8. 【CSP-SJX 2019】T4 散步

    Description 传送门 Solution 算法1 32pts 枚举每个时刻,并枚举所有发生的时间,暴力进行更新.发现最多只需要枚举到第 \(L\)个时刻,因为是一个环,所以最多到第L个时刻,所 ...

  9. Tensorflow加载预训练模型和保存模型(ckpt文件)以及迁移学习finetuning

    转载自:https://blog.csdn.net/huachao1001/article/details/78501928 使用tensorflow过程中,训练结束后我们需要用到模型文件.有时候,我 ...

  10. JAVA多线程间隔时间段执行方法

    import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class ManyProject ...