重新整理 .net core 实践篇 —linux上排查问题实用工具 [外篇]

前言

介绍下面几个工具:

Lldb
createdump
dotnet-dump
dotnet-gcdump
dotnet-symbol
Procdump

该文的前置篇为:

https://www.cnblogs.com/aoximin/p/16839812.html

献给初学者,这篇就只介绍下看下日志和lldb,毕竟东西太多了。

正文

我以官网的例子作为演示:https://buggyambfiles.blob.core.windows.net/bin/buggyamb_v1.1.zip

项目地址:https://github.com/ahmetmithat/buggyamb

我这里就已经发布可以访问了,并且用户nginx 作为转发,已经启动起来了。

步骤在前面两篇,如果看需要发布的,可以往前面两篇看看,这里就不多复述了。

[Unit]
Description=BuggyAmb[Service]
WorkingDirectory=/var/buggyamb
ExecStart=/usr/bin/dotnet /var/buggyamb/BuggyAmb.dll
Restart=aways
RestartSec=10
SyslogIdentifier=BuggyAmb
User=root
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=ASPNETCORE_URLS=http://0.0.0.0:6000
[Install]
WantedBy=multi-user.target

service 的配置如上。

页面测试如下:

33edde1fefa0b1928aa1cbdf7df99c59.png

里面分别是:

慢、处理异常、不处理异常、崩溃、未找到页面、批处理

崩溃情况

这种比较好排查的,其实一般看日志就行。

我这里点一下Crash2,让程序崩溃。这里说明一下,上面我用的是官方例子,直接可以看代码怎么崩溃的哈。

public class Crash2Model : PageModel
{public string quote;~Crash2Model(){if (quote.ToString() != string.Empty){quote = null;}}public void OnGet(){}
}

这个可以看下。

那么我们进行日志排查一下错误。

journalctl -r --identifier=BuggyAmb --since "10 minute ago"

90db3f6dbb2b342d9cd1bcb9a0864938.png

af7bc97b0536d70b6d85e39bd3ae9ba8.png

告诉我们15行错误。

-r:按反向顺序打印日志,以便首先列出最新日志。
--identifier:请记住 SyslogIdentifier=buggyamb-identifier 测试应用程序的服务文件中的行。(可以使用此方法强制日志仅显示适用于有问题的应用程序的条目。)
--since:显示在指定的上一时期记录的信息。示例:--since "10 minute ago" 或 --since "2 hour ago".

journalctl 还有很多其他的功能,这里就不一一举例了。

核心转储

centos 默认不开启的:

可以看下这个怎么开启的:

https://blog.csdn.net/ProgramVAE/article/details/105921381

#!/bin/bash#me: coredumpshell.sh
### Description: enable coredump and format the name of core file on centos system# enable coredump whith unlimited file-size for all users
echo -e "\n# enable coredump whith unlimited file-size for all users\n* soft core unlimited" >> /etc/security/limits.conf# set the path of core file with permission 777 
cd /var/buggyamb && mkdir corefile && chmod 777 corefile# format the name of core file.   
# %% – 符号%
# %p – 进程号
# %u – 进程用户id
# %g – 进程用户组id
# %s – 生成core文件时收到的信号
# %t – 生成core文件的时间戳(seconds since 0:00h, 1 Jan 1970)
# %h – 主机名
# %e – 程序文件名
echo -e "/var/buggyamb/corefile/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern# for centos7 system(update 2017.2.3 21:44)
echo -e "/var/buggyamb/corefile/core-%e-%s-%u-%g-%p-%t" > /etc/sysctl.conf# suffix of the core file name
echo -e "1" > /proc/sys/kernel/core_uses_pid

运行之后就开启了。

centos 一般用不上,我也没有去调试过,这里就不演示了,只能说有这种东西。

使用lldb

安装:yum install lldb

前文提及到这个要安装lldb 3.9 以上的。

按照这个文档来编译安装也行:

https://github.com/dotnet/diagnostics/blob/main/documentation/lldb/linux-instructions.md

在 lldb 中打开核心转储文件之前,请按照以下必需步骤设置符号路径,下载符号,并在打开 lldb 时自动加载 SOS :

安装 dotnet 符号工具:

dotnet tool install -g dotnet-symbol

下载目标转储文件的符号:

dotnet-symbol <path_of_dump_file>

安装 SOS:

安装 dotnet-sos 全局工具:

dotnet tool install -g dotnet-sos

安装 SOS:

dotnet-sos install

最后成功的样子:

f2c75f0afd4cd604ff1ddab7364a2692.png

使用createdump:

Createdump 会与每个 .NET Core 运行时一起自动安装。

如 创建的ump 配置策略 文档中所述,可以设置具有环境变量的配置选项。这些将作为参数传递给创建的ump 命令。下面是支持的环境变量:

COMPlus_DbgEnableMiniDump:如果设置为 1,则在终止时启用自动核心转储生成。默认值为 0 。
COMPlus_DbgMiniDumpType:这是将要创建的微型转储文件的类型。此值的默认值为 2 (或枚举类型 MiniDumpWithPrivateReadWriteMemory) 。这意味着生成的转储文件将包括 GC 堆以及捕获进程中所有现有线程的堆栈跟踪所需的信息。
COMPlus_DbgMiniDumpName:如果设置,请用作模板来创建转储文件路径和文件名。可以使用参数将 PID 放入名称中 %d 。默认模板为 /tmp/coredump.%d. 通过使用此环境变量,可以配置输出目录。
COMPlus_CreateDumpDiagnostics:如果设置为 1,则启用创建的ump 工具诊断消息 (TRACE 宏) 。如果 createdump 不能按预期工作并且不生成内存转储文件,则此设置可能很有用。

详细信息如下:https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md#configurationpolicy

进行开启:

2e4e585cc1f0d3f829e7882f216dc4ec.png

然后重启,再来点击clash3进行崩溃一下。

73a4c4d29beb422432fc79044ad9a2c5.png

可以看到这里就有了。

这里我们先转储文件符号一下:

dotnet-symbol /tmp/coredump.9784-o /dumps/symbols/ --host-only

然后进去一下:

lldb --core /tmp/coredump.9784

这个时候要加载一下dotnet 符号。

setsymbolserver -directory /dumps/symbols/

然后加载转储文件符号:

loadsymbols

这样就搞定了。

clrsthread 查看一下线程的情况:

d902956dfc56b574ada79fc532d1d1bc.png

这里可以看到里面有个异常是15号线程。

切到15号线程:

setthread 15:

717053a9a9a25c3c8ce14b60fada937e.png

然后查看一下clrstack(调用栈信息):

585f58606648a6772e1fd1d5ff901239.png

这个似乎没有告诉我们很多很有用的信息,只能告诉我们线程异常了,当然也告诉我们具体的行,可以去看下去源代码看下什么类型异常,但是有跟好用的pe。

用pe查看下:

pe  -- Displays and formats fields of any object derived from the Exception class at the specified address.

17db04f536d98da7e84067065dac2f56.png

这样就定位到具体的崩溃文件了。

知道了崩溃是因为HttpWebRequest,希望的是能查到到底是哪个访问url造成了崩溃。

下面这个图,证明可调用了HttpWebRequest引发的:

4d8ac47df422b3e47e53355027e3f514.png

使用dumpheap:dumpheap -stat -type System.Net.HttpWebRequest 查看httpwebrequest 调用栈:

39b11fc1b61eb97bd71b1273d59e0711.png

查看栈地址:

c85d708bfb1953d3684d59bfe21a14b3.png

然后是根据地址查看对象:dumpobj 00007fe0c4442f28

ae67f66294436544e495bb85c4636319.png

这个webrequest 里面有一个是system.url 我们写程序的知道这是访问地址。

然后继续查这个对象,上面那个value 就是地址哈。

00007fe0c4437cf8

然后可以看到url 地址:

c7839eed06e4e7fb0828f94d700c5e94.png

第一个就是了,为什么确认第一个就是,看名字。

73907f79afbb42c746f4638e5051e4e7.png

这样就查到了。

先到这里吧,介绍这个lldb 是为了查看非托管栈的,如果查看托管的一般使用dotnet-dump 就好了。

而且一般是用来分析cpu 和 内存高的地方,一般服务端错误会有日志的。

继续后面演示cpu 和 内存高的例子,这个对服务端更有实用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Office 365离线安装

Office 365除了可以在线安装外&#xff0c;还可以进行离线安装&#xff0c;但激活还是需要连接互联网的哟首先下载Office部署工具https://www.microsoft.com/en-us/download/details.aspx?id49117 下载文件后&#xff0c;运行自解压缩可执行文件&#xff0c;其中包含 Office 部…

reduceByKey和groupByKey区别与用法

2019独角兽企业重金招聘Python工程师标准>>> 在Spar看中&#xff0c;我们知道一切的操作都是基于RDD的。在使用中&#xff0c;RDD有一种非常特殊也是非常实用的format——pair RDD&#xff0c;即RDD的每一行是&#xff08;key, value&#xff09;的格式。这种格式很…

python自动化测试-D6-学习笔记之一(常用模块补充datetime模块)

# datetime 模块import datetimeprint(datetime.datetime.today()) #当前日期&#xff0c;到秒 打印结果&#xff1a;2018-01-21 10:23:46.034410print(datetime.datetime.now()) # 当前日期&#xff0c;到秒 打印结果&#xff1a;2018-01-21 10:23:46.034410print(datetime.d…

Vue如何在data中正确引入图片路径

方法一&#xff1a;将图片资源放入项目 /static 目录下&#xff0c;使用绝对或相对路径引用即可 // 文件结构 |-- src | |-- components | | |-- banner.vue |-- static | |-- images | | |-- pic.jpg<template><div id"banner"><img :s…

软件工程的第一性原理丨SmartIDE

作者&#xff1a;徐磊原文地址&#xff1a;https://smartide.cn/zh/blog/2022-1022-software-engineering/徐磊英捷创软科技&#xff08;北京&#xff09;有限公司创始⼈/⾸席架构师 / CEO / SmartIDE开源项⽬创始⼈。微软最有价值专家MVP&#xff0c;微软区域技术总监&#xf…

排序算法之快速排序详解

一、算法介绍 快速排序&#xff1a;快速排序的基本思想是通过一次排序将等待的记录分成两个独立的部分&#xff0c;其中一部分记录的关键字小于另一部分的关键字。C部分的快速排序一直持续到整个序列被排序。 任取一个元素 (如第一个) 为中心提出所有小于它的元素&#xff0c;并…

openstack 中国联盟公开课參会总结

主流趋势 1. openstack defcore 互操作性认证。打通不同的openstack 厂商之间的连接2. 首批OpenStack管理员认证(COA)将于2016年进行3. 混合云应用广泛 Cloud Broker,cascading openstack 云连接器4. DevOps5. 虚拟桌面6. Storage 方面&#xff0c;Ceph和Glusterfs 7. Network…

bzoj1088[SCOI2005]扫雷Mine

1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4284 Solved: 2552[Submit][Status][Discuss]Description 相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷&#xff0c;要你根据一些信息找出雷来。万圣节到了&#xff0c;“余”人国流…

Re:从零开始的Vue项目搭建

Re&#xff1a;从零开始的Vue项目搭建初始的终结与结束的开始Nodejs项目的简单测试从零开始webpack开发模式webpack编译打包后记初始的终结与结束的开始 最开始接触vue项目搭建是从vue-cli开始&#xff0c;模板式操作&#xff0c;一键搞定&#xff0c;几乎可以无缝进入代码开发…

在数据库插入带小数点数据的问题

想在mysql插入以下数据设计表的时候没有注意,之前都用的int,这次换成了double,但是插入第一条3.50的时候数据库显示为:查了之后知道是设计表的时候没有注意小数点的设置转载于:https://juejin.im/post/5c0f61bb6fb9a049ea38cbe9

oracle 11g 创建 job 20

15-10-19 23:48:04分类&#xff1a; Oracle--创建一次执行的匿名块任务&#xff0c;成功调用一次后job消失BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name > my_new_job2, job_type > PLSQL_BLOCK, job_action &g…

Jzoj5317 Func

f(1)1 f(2x)f(x) f(2x1)f(x)f(x1) 给出n<10^6&#xff0c;求:所有的i满足f(i)n 第一道类欧算法 我们考虑一个性质 f(2x1)f(x)f(x1)f(2x)f(2x2) 所以&#xff0c;显然有f(2x1)>f(2x) f(2x1)>f(2x2) 那么现在我们知道了f(2x1),自然考虑枚举一个f(2x) 可以按照以下形式…

C# WPF 用代码画一幅图(*精品*)

概述有时候我们的程序界面中需要显示一些简单的示意图&#xff0c;一般我们有原图的话直接嵌入我们程序就可以&#xff0c;但有时候我们没有原图&#xff0c;这时候我们不妨用代码自己画出来.今天小编要给大家展示的是这样一副图片&#xff1a;接下来&#xff0c;我就用代码纯手…

矿难让显卡压了那么多货咋办?NV如是说

2019独角兽企业重金招聘Python工程师标准>>> 在苏州 GTC 开幕的几天前&#xff0c;英伟达刚刚遭遇了一次股价的腰斩。 近来加密货币的热度渐低&#xff0c;受到挖矿热潮照顾许多的英伟达「矿机」销量受到打击&#xff0c;甚至出现了严重的库存危机&#xff0c;加上近…

花式看超级碗 人工智能、大数据在碗里

“超级碗”可不是一个大碗!!!超级碗(Super Bowl)是美国国家美式足球联盟(也称为国家橄榄球联盟)的年度冠军赛&#xff0c;胜者被称为“世界冠军”。超级碗一般在每年1月最后一个或2月第一个星期天举行&#xff0c;那一天称为超级碗星期天(Super Bowl Sunday)。超级碗是比赛的名…

Git分支操作与远程仓库的使用

Git分支操作本地仓库创建分支合并分支删除分支远程仓库push 推送远程分支pull 拉取远程分支fetch 更新远程分支本地分支与远程分支的跟踪关系本地仓库 由于Git的分布式特性&#xff0c;所以没有绝对的本地和远程概念&#xff0c;一切都是相对的。对于分支的操作&#xff0c;个…

SimMechanics/Second Generation倒立摆模型建立及初步仿真学习

笔者最近捣鼓Simulink&#xff0c;发现MATLAB的仿真模块真的十分强大&#xff0c;以前只是在命令窗口敲点代码&#xff0c;直到不小心敲入simulink&#xff0c;就一发不可收拾。话说simulink的模块化建模确实方便&#xff0c;只要拖拽框框然后双击设置属性就可以慢慢堆建自己的…

10 行代码提取复杂 Excel 数据

把 Excel 文件导入关系数据库是数据分析业务中经常要做的事情&#xff0c;但许多 Excel 文件的格式并不规整&#xff0c;需要事先将其中的数据结构化后再用 SQL 语句写入数据库。而一般情况下&#xff0c;结构化的工作量会比较大&#xff0c;而且很难通用&#xff0c;每次都要针…

将一个数组拆分为若干个相等数组

var a [法国,澳大利亚,智利,新西兰,西班牙,加拿大,阿根廷,美国,0,国产,波多黎各,英国,比利时,德国,意大利,意大利]; var b []; var result []; var k 0; for(var i 0; i<a.length; i){ if(i%3 0){ b []; for(var j 0; j<3; j){ if(a[ij] undefined){ continue; …

人工智能模型的网络结构可视化

本文主要介绍人工智能模型的网络结构可视化的常见方法。对于使用神经网络模型来说&#xff0c;我们主要关注的是模型的输入和输出。在 ML.NET 中使用 ONNX 模型时&#xff0c;我们就需要了解这些信息&#xff0c;以便在构成神经网络的所有层之间生成连接映射。下图就是昨天 《Y…