惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
Y
Y Combinator Blog
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LangChain Blog
S
SegmentFault 最新的问题
J
Java Code Geeks
V
Visual Studio Blog
H
Help Net Security
Stack Overflow Blog
Stack Overflow Blog
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
B
Blog RSS Feed
The Cloudflare Blog
MyScale Blog
MyScale Blog
月光博客
月光博客
Microsoft Security Blog
Microsoft Security Blog
美团技术团队

博客园 - Rick Carter

官方APP太难用了,所以我写了个 OpenNas App 死锁是怎么发生的,举个简单的例子 hangfire内部执行器是同步的,会导致死锁 缓存读写代码逻辑的正确姿势 dotnet未捕获异常导致系统崩溃问题 EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包) 修复达梦EFCore驱动布尔类型兼容问题 dotnet使用redis时需要注意的问题 巧用 using 作用域(IDisposable)的生命周期包装特性 实现前后置处理 非托管内存怎么计算? dotnet集合类型性能优化的两个小儿科的知识点 一个前端树形控件联动勾选框卡顿问题及解决 .net c# Func<Task>及变体做为多播委托异步执行会另开线程的问题 关于EFCore插件API使用中踩过的坑 利用C#9.0中的record提高性能 dotnet CultureInfo遇到欧洲如俄文小数点是逗号想转点的解决办法 hangfire.entityframeworkcore这个库因为System.Threading.Timer未停止也未释放而导致的性能问题 达梦DM.Microsoft.EntityFreameworkCore查询报错invalid cast from DateTime to DateTimeOffset 达梦DOTNET驱动DM.Provider8.3.1.30495存在空字符串插入变DBNull的问题 是否可以考虑做一个dotnet应用的性能诊断工具
dotnet-dump安装、收集dump和崩溃自动收集dump
Rick Carter · 2025-11-30 · via 博客园 - Rick Carter

继续写点基础的东西,因为基础的东西能带新手入门,入门后的事情其实是比较简单的。

我们开发dotnet程序后运行时经常出问题,比如cpu高、内存高、崩溃等问题,分析的方法就是使用dotnet的那套分析工具,今天以dotnet-dump为例,简单说下从安装到收集的操作步骤。

1.安装SDK

dotnet分析工具需要dotnet sdk环境,所以需要先安装sdk,以docker下Debian系统为例。参考地址是这个:
https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-debian?tabs=dotnet10

  • 先安装wget
apt update
apt install wget
  • 再添加包存储库,我删除了sudo,搜索也需要先安装sudo命令
wget https://packages.microsoft.com/config/debian/13/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
  • 安装sdk,下面代码是sdk10的,如果需要其他版本直接改版本号就行
sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-10.0

2.安装dotnet-dump和收集dump

参考文档
https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-dump#dotnet-dump-analyze

dotnet tool install --global dotnet-dump

现在找到要dump的dotnet进程id,如果在docker里只运行一个dotnet程序,那么这个id一般都是1,也可以先ps命令找下。

dotnet-dump ps
dotnet-dump collect -p 1

这个collect就是收集,它根据dotnet进程内存大小需要一些时间,完成后就会提示收集的dump文件路径,等会就用analyze命令分析它,今天不是主要讲怎么分析,所以略过。

3.崩溃自动收集dump

参考文档
https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/collect-dumps-crash
这个的目的就是当dotnet程序因为一些无法继续的异常发生时,如堆栈溢出、未捕获的异常等会导致程序崩溃(结束进程,有守护进程会重新启动一个新的),自动收集dump,以便分析程序崩溃的原因。
这个非常简单,主要就时加一个环境变量

DOTNET_DbgEnableMiniDump=1

还有个环境变量也很重要,就是DOTNET_EnableCrashReport=1,它会使得在崩溃收集dump时还生成一个json,存储所有线程的信息(大部分时堆栈),里面有个关键的信息就是"crash":"true",它表示这个线程是引起崩溃的线程,崩溃的情况下,这个json里肯定有个线程是带"crash":"true"的,其他线程都是"crash":"false",所以在这个json里搜索这个就很快定位的引起崩溃的线程,以便在dump文件中快速定位问题原因。
用这套dotnet分析工具,我在工作中找到了很多次问题,有时还是线上环境,有cpu内存高的、有死锁的、有调用native代码导致的,都是写的代码错误导致,非常有用。当然这些都包含公司机密,不方便分享,所以就不能写出来了,我在博客里分享的都不会包含公司保密规定的内容,只能分享纯技术类的。

4.容器中需要添加调试权限

如果在docker容器里,需要加 允许进程跟踪和调试其他进程的能力(如下),否则dotnet-dump命令会报错。注意上下文对齐

cap_add:
  - CAP_SYS_PTRACE

Kubernetes里的配置,注意上下文对齐

capabilities:
  add:
  - SYS_PTRACE

当然这个存在一定的安全风险,有最佳做法,去搜索下吧。

完。