dotnet-dump安装、收集dump和崩溃自动收集dump
<p>继续写点基础的东西,因为基础的东西能带新手入门,入门后的事情其实是比较简单的。</p><p>我们开发dotnet程序后运行时经常出问题,比如cpu高、内存高、崩溃等问题,分析的方法就是使用dotnet的那套分析工具,今天以dotnet-dump为例,简单说下从安装到收集的操作步骤。</p>
<h3 id="1安装sdk">1.安装SDK</h3>
<p>dotnet分析工具需要dotnet sdk环境,所以需要先安装sdk,以docker下Debian系统为例。参考地址是这个:<br>
https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-debian?tabs=dotnet10</p>
<ul>
<li>先安装wget</li>
</ul>
<pre><code class="language-Bash">apt update
apt install wget
</code></pre>
<ul>
<li>再添加包存储库,我删除了sudo,搜索也需要先安装sudo命令</li>
</ul>
<pre><code class="language-Bash">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
</code></pre>
<ul>
<li>安装sdk,下面代码是sdk10的,如果需要其他版本直接改版本号就行</li>
</ul>
<pre><code class="language-Bash">sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-10.0
</code></pre>
<h3 id="2安装dotnet-dump和收集dump">2.安装dotnet-dump和收集dump</h3>
<p>参考文档<br>
https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-dump#dotnet-dump-analyze</p>
<pre><code class="language-Bash">dotnet tool install --global dotnet-dump
</code></pre>
<p>现在找到要dump的dotnet进程id,如果在docker里只运行一个dotnet程序,那么这个id一般都是1,也可以先ps命令找下。</p>
<pre><code class="language-Bash">dotnet-dump ps
dotnet-dump collect -p 1
</code></pre>
<p>这个collect就是收集,它根据dotnet进程内存大小需要一些时间,完成后就会提示收集的dump文件路径,等会就用analyze命令分析它,今天不是主要讲怎么分析,所以略过。</p>
<h3 id="3崩溃自动收集dump">3.崩溃自动收集dump</h3>
<p>参考文档<br>
https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/collect-dumps-crash<br>
这个的目的就是当dotnet程序因为一些无法继续的异常发生时,如堆栈溢出、未捕获的异常等会导致程序崩溃(结束进程,有守护进程会重新启动一个新的),自动收集dump,以便分析程序崩溃的原因。<br>
这个非常简单,主要就时加一个环境变量</p>
<pre><code class="language-env">DOTNET_DbgEnableMiniDump=1
</code></pre>
<p>还有个环境变量也很重要,就是DOTNET_EnableCrashReport=1,它会使得在崩溃收集dump时还生成一个json,存储所有线程的信息(大部分时堆栈),里面有个关键的信息就是"crash":"true",它表示这个线程是引起崩溃的线程,崩溃的情况下,这个json里肯定有个线程是带"crash":"true"的,其他线程都是"crash":"false",所以在这个json里搜索这个就很快定位的引起崩溃的线程,以便在dump文件中快速定位问题原因。<br>
用这套dotnet分析工具,我在工作中找到了很多次问题,有时还是线上环境,有cpu内存高的、有死锁的、有调用native代码导致的,都是写的代码错误导致,非常有用。当然这些都包含公司机密,不方便分享,所以就不能写出来了,我在博客里分享的都不会包含公司保密规定的内容,只能分享纯技术类的。</p>
<h3 id="4容器中需要添加调试权限">4.容器中需要添加调试权限</h3>
<p>如果在docker容器里,需要加 允许进程跟踪和调试其他进程的能力(如下),否则dotnet-dump命令会报错。注意上下文对齐</p>
<pre><code class="language-yaml">cap_add:
- CAP_SYS_PTRACE
</code></pre>
<p>Kubernetes里的配置,注意上下文对齐</p>
<pre><code class="language-yaml">capabilities:
add:
- SYS_PTRACE
</code></pre>
<p>当然这个存在一定的安全风险,有最佳做法,去搜索下吧。</p>
<p>完。</p>
</div>
<div id="MySignature" role="contentinfo">
<div id="AllanboltSignature">
<p id="PSignature" style="border-top-color: #e0e0e0; border-top-width: 1px; border-top-style: dashed; border-right-color: #e0e0e0; border-right-width: 1px; border-right-style: dashed; border-bottom-color: #e0e0e0; border-bottom-width: 1px; border-bottom-style: dashed; border-left-color: #e0e0e0; border-left-width: 1px; border-left-style: dashed; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 80px; background-image: url(https://images.cnblogs.com/cnblogs_com/pains/109838/r_copyright.png); background-attachment: initial; background-origin: initial; background-clip: initial; font-family: 微软雅黑; font-size: 11px; background-color: #e5f1f4; background-position: 1% 50%; background-repeat: no-repeat no-repeat; ">
作者:Rick Carter
<br />
出处:http://pains.cnblogs.com/
<br />
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
</p>
</div><br><br>
来源:https://www.cnblogs.com/pains/p/19287804
頁:
[1]