原文https://www.cnblogs.com/calvinK/p/9263696.html

centos7下安装lldb,dotnet netcore 进程生成转储文件,并使用lldb进行分析

随着netcore应用在linux上部署的应用越来越多,碰到cpu 100%,内存暴涨的情况也一直偶有发生,在windows平台下进程管理器右键转储,下载到本地使用windbg或者直接vs分析都比较方便。而在linux平台下因为一直接触的不深,所以对这一块也一直没有比较好的了解。所以接下来的文章将对在centos7下安装lldb,生成转储以及调试分析进行一些简单说明。
还有就是一般产线的机器也不太会有可以直接调试的机会,所以真出现问题也只能在产线机器dump进程,然后下载到本地来慢慢分析。

环境说明:
os:centos7
dotnet :2.1.1。查看官方文档2.0.0只能使用lldb 3.6;2.1以上必须是3.9.0;所以特别要注意版本问题,一个是createdump 2.0的有bug会失败。二个是dotnet版本和lldb版本要匹配
被调试分析的应用也是用2.1跑起来的。

测试目标程序

yum install dotnet-sdk-2.1
dotnet new mvc
vi /mvc.csproj
#netcoreapp2.0 to netcoreapp2.1
#PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" to Version="2.1.1"
dotnet restore
dotnet build
dotnet ./bin/Debug/netcoreapp2.1/mvc.dll

centos7 升级GCC,安装cmake

centos7 升级GCC版本到7.3.0
centos7 安装cmake

centos7下安装lldb调试工具

最开始直接使用给力网友的脚本进行安装(脚本地址查看文章结尾参考资料),后发现3.9.1不能调试分析netcore应用,必须要3.9.0,所以在给力网友的脚本上略作修改后使用。修改后脚本地址https://github.com/czd890/shell/blob/master/llvm_clang_lldb/3.9.0/llvm_clang_install.sh。主要修改几个地方:把lldb,libunwind移动到build_llvm_toolchain中,一次性安装。check_and_download方法中检查本地是否已下载源码包的检查略作修改,只判断指定版本,编译的时候修改为make -j8(我本地机器8核)。

脚本大概思路就是下载如下所表示的组件所有源码,除llvm外的其他组件源代码解压到llvm/tools目录下,这样子源代码就全部准备好
BUILD_TARGET_COMPOMENTS="llvm clang compiler_rt libcxx libcxxabi clang_tools_extra lldb lld libunwind";
接下来就是编译的过程了。

#安装一些必要的依赖组件
yum install libedit-devel libxml2-devel ncurses-devel python-devel swig
#执行根据给力网友的脚本修改后的脚本

  

当然如果脚本下载速度慢,也是可以自己下载后上传的目录的。具体下载地址查看文章尾部参考资料 llvm,clang,lldb源代码下载地址(3.9.0)
准备源代码差不多就如下图。然后 sh llvm_clang_install.sh开始执行脚本;
默认安装目录在 PREFIX_DIR=/usr/local/llvm-$LLVM_VERSION;。也就是是 /usr/local/llvm-3.9.0;可以在脚本的最开始对此进行修改。

开始执行,又是一段漫长的等待时间,8核并发编译,耗费了估计得有1-2个小时。

刀片机的CPU都跑满了!!!

出去吃完饭后回来,就看到完成拉。具体的path路径可以选择加不加都可以,加的话,直接/etc/profile export PATH=$PATH:llvm-path/bin即可

lldb安装完成,我们的工作就完成一大半拉。

dotnet netcore应用如何生成内存转储文件

/usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1/createdump 9364

  


具体命令解释
createdump [options] pid
-f, --name - dump path and file name. The pid can be placed in the name with %d. The default is "/tmp/coredump.%d"
-n, --normal - create minidump (default).
-h, --withheap - create minidump with heap.
-t, --triage - create triage minidump.
-u, --full - create full core dump.
-d, --diag - enable diagnostic messages.

使用lldb调试分析netcore应用内存转储文件

#官方文档上是这样写的。
/usr/local/llvm-3.9.0/bin/lldb -O "settings set target.exec-search-paths /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1"  \
-o "plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1/libsosplugin.so" \
--core /opt/dump\_file/mvcdumpmindump /usr/share/dotnet/dotnet
 #网友调试参考博客上是这样写的。 
/usr/local/llvm-3.9.0/bin/lldb dotnet \ -c /opt/dump\_file/mvcdumpmindump \ -o "plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1/libsosplugin.so"

2种写法都是可行的。然后具体的调试分析指令什么的都在coreclr调试说明指导文档有说明。

参考资料:
coreclr调试说明指导文档
https://github.com/dotnet/coreclr/blob/master/Documentation/building/debugging-instructions.md
coreclr生成dmp说明指导文档
https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md
llvm,clang,lldb源代码下载地址(3.9.0)
http://releases.llvm.org/download.html#3.9.0
lldb源码安装指导文档
http://lldb.llvm.org/build.html#BuildingLldbOnLinux
llvm源码安装指导文档
http://releases.llvm.org/3.9.0/docs/GettingStarted.html
网友centos7安装llvm,clang,lldb等给力脚本
https://github.com/owent-utils/bash-shell/blob/master/LLVM%26Clang%20Installer/3.9/installer.sh
网友调试参考博客文章
使用SOS调试工具检查应用程序状态

dump net core lldb 安装的更多相关文章

  1. dump net core windbg 安装

    安装 1.下载工具windbg 地址:https://www.microsoft.com/zh-cn/p/windbg-preview/9pgjgd53tn86?SilentAuth=1&rt ...

  2. dump net core lldb 分析

    原文https://www.cnblogs.com/calvinK/p/9274239.html centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试) 写个dem ...

  3. [.NET Core].NET Core R2安装教程及Hello示例

    前言 前几天.NET Core发布了.NET Core 1.0.1 R2 预览版,之前想着有时间尝试下.NET Core.由于各种原因,就没有初试.刚好,前几天看到.NET Core发布新版本了,决定 ...

  4. BDD实战篇 - 在.NET Core下安装Specflow

    这是<如何用ABP框架快速完成项目 >系列中的一篇文章. BDD很赞!比TDD先进很多,能够大大提高编码效率. 让我们动手起来吧!先在.NET Core下安装Specflow! 官网教程在 ...

  5. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

  6. NetCore入门篇:(一)Net Core环境安装

    一.下载Visual Studio 2017 1.下载地址:https://www.visualstudio.com/zh-hans/downloads/ 2.选择要下载的版本 二.安装Net Cor ...

  7. .NET Core R2安装及示例教程

    .NET Core R2安装及示例教程 Install for Windows - Visual Studio 2015 1 Download Visual Studio 2015 Make sure ...

  8. 在 Asp.Net Core 中安装 MVC

    在 ASP.NET Core 中安装 MVC 到目前为止,我们在本系列视频中使用的 ASP.NET Core 项目是使用“空”项目模板生成的.目前这个项目没有设置和安装 MVC. 两个步骤学会在 AS ...

  9. .NET Core 代码安装服务启动

    最近做了一些.NET Core的程序,有在Windows下运行的 有在CentOS 下运行的,Windows下运行的还好,对Windows下还算比较熟悉了,但CentOS 下 每次都是找笔记支持命令 ...

随机推荐

  1. ssh免密钥登陆的两种方式

    ssh 免密钥登陆的两种方式第一种:直接使用命令复制过去ssh-copy-id root@192.168.3.113批量复制for i in {113..140}; do ssh-copy-id ro ...

  2. SpringBoot整合MyBatis例子

    1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  3. 作业:IEEE754浮点数

    人工转换: 5.75转换成二进制:101.11右移2位,补0:1.0111000000000000000000000000000000000000000000000000.10000000001 16 ...

  4. 支付宝小程序开发——如何获取支付宝小程序页面的https链接

    前边介绍过通过配置支付宝Scheme协议alipays://来实现h5到小程序的跳转,其实还可以获取小程序页面的https格式链接,虽然支付宝官方并没有直接提供方案,但是通过小程序后台的“码管理”给页 ...

  5. Mysql创建数据库以及用户分配权限

    一.创建mysql数据库 1.创建数据库语法 --创建名称为“testdb”数据库,并设定编码集为utf8 CREATE DATABASE IF NOT EXISTS testdb DEFAULT C ...

  6. 关于OpenGPU.org

    今天是心情沉重的一天. OpenGPU.org,作为当年中国图形学界首屈一指的论坛,曾经创造过日访问破万的记录,而且汇聚了中国所有的图形行业的精英,大家畅所欲言,为整个中国图形学业界分享了无数宝贵的资 ...

  7. Centos7.5安装OpenJDK1.8

    安装openJDK 1.8yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 获取java home dirname $(readli ...

  8. google cloud storage products

    https://cloud.google.com/products/storage/ BigTable Cloud Bigtable 是 Google 面向大数据领域的 NoSQL 数据库服务.它也是 ...

  9. [译]在Python中,如何拆分字符串并保留分隔符?

    原文来源:https://stackoverflow.com/questions/2136556/in-python-how-do-i-split-a-string-and-keep-the-sepa ...

  10. SVM – 线性分类器

    感知机 要理解svm,首先要先讲一下感知机(Perceptron),感知机是线性分类器,他的目标就是通过寻找超平面实现对样本的分类:对于二维世界,就是找到一条线,三维世界就是找到一个面,多维世界就是要 ...