中小研发团队架构实践之生产环境诊断工具WinDbg

生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器。调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具,Dump文件类似于飞机的黑匣子,记录着生产环境程序运行的状态。本文主要介绍了调试工具WinDbg和抓包工具ProcDump的使用,并分享一个真实的案例。N年前不知谁写的代码,导致每一两个月偶尔出现CPU飙高的现象。我们先使用ProcDump在生产环境中抓取异常进程的Dump文件,然后在不了解代码的情况下通过WinDbg命令进行分析,最终定位到有问题的那行代码。

一、诊断工具简介

1.1 WinDbg

WinDbg是在Windows平台下的、强大的用户态和内核态调试工具。相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能,却比VS更为强大。它的另外一个用途是可以用来分析Dump数据。WinDbg是Microsoft公司免费调试器调试集合中的GUI的调试器,支持Source和Assembly两种模式的调试。WinDbg不仅可以调试应用程序,还可以进行Kernel Debug。结合Microsoft的Symbol Server,可以获取系统符号文件,便于应用程序和内核的调试。WinDbg支持的平台包括x86、IA64、AMD64。虽然WinDbg也提供图形界面操作,但它最强大的地方还是有着强大的调试命令,一般情况会结合GUI和命令行进行操作,常用的视图有:局部变量、全局变量、调用栈、线程、命令、寄存器、白板等。其中“命令”视图是默认打开的。

1.2 DebugDiag

DebugDiag最初是为了帮助分析IIS的性能问题而开发的,它同样可以用于任何其他的进程。DebugDiag工具主要用于帮助解决如挂起、 速度慢、 内存泄漏或内存碎片,和任何用户模式进程崩溃等问题。该工具包括附加调试脚本,侧重于互联网信息服务(IIS)应用程序、 Web数据访问组件、 COM+和相关Microsoft技术、SharePoint和.NET。它提供可扩展对象模型中的COM对象的形式,并具有一个内置的报告框架提供的脚本主机。它由3 部分组成,包括调试服务、 调试器主机和用户界面。

1.3 ProcDump

ProcDump是System Internal提供的一个专门用来监测程序CPU高使用率从而生成进程Dump文件的工具。ProcDump可以根据系统的CPU使用率或者指定的性能计数器来针对特定进程生成一系列的Dump文件,以便调试者对事故原因进行分析。

二、诊断工具下载

  • WinDbg x86位版本下载:【http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools/dbg_x86.msi】

  • WinDbg x64位版本下载:【http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools_amd64/dbg_amd64.msi】

  • DebugDiag v2下载:【https://www.microsoft.com/en-us/download/details.aspx?id=49924】

  • ProcDump v9.0下载:【https://download.sysinternals.com/files/Procdump.zip】

三、获取异常进程的Dump文件

有以下四种方式获取Dump文件,具体如下:

3.1 通过【任务管理器】获取Dump文件,这样获取的是MinDump

640?wx_fmt=jpeg

3.2 利用WinDbg的adplus获取Dump文件,这样获取的是FullDump

640?wx_fmt=jpeg

3.3 通过DebugDiag创建.NET异常转储Dump文件

640?wx_fmt=gif

640?wx_fmt=jpeg

3.4 通过ProcDump抓取异常线程Dump文件

现在重点介绍通过ProcDump抓取异常线程Dump文件,使用方法如下:

a. 命令行:

procdump [-a] [[-c|-cl CPU usage] [-u] [-s seconds]] [-n exceeds] [-e [1 [-b]] [-f <filter,...>] [-g] [-h] [-l] [-m|-ml commit usage] [-ma | -mp] [-o] [-p|-pl counter threshold] [-r] [-t] [-d <callback DLL>] [-64] <[-w] <process name or service name or PID> [dump file] | -i <dump file> | -u | -x <dump file> <image file> [arguments] >] [-? [ -e]

b. 实例:

procdump -c 70 -s 5 -ma -n 3 w3wp

当系统CPU使用率持续5秒超过70%时,连续抓3个Full Dump。

procdump outlook -p "\Processor(_Total)\% Processor Time" 80

当系统CPU使用率超过80%,抓取Outlook进程的Mini Dump。

procdump -ma outlook -p "\Process(Outlook)\Handle Count" 10000

当Outlook进程Handle数超过10000时抓取Full Dump

procdump -ma 4572

直接生成进程号为4572的Full Dump。

 

下图是在WindgbHighCpu进程中造成High CPU时运行ProcDump命令的运行效果,可以看到在CPU每次持续5秒达到5%后就会生成相应的Dump文件,共生成了3份Full Dump文件:

640?wx_fmt=jpeg

c. 注意:

  • ProcDump需要进程已经启动,并且中途不能停止。比如需要抓取IIS Worker Process的High CPU Dump,由于IIS Worker Process默认会配置Idle Timeout = 20 min,即该进程在20分钟内没有任何请求的话就会自动结束,这种情况下ProcDump也会自动结束。需要重新运行命令。因此如果目标程序存在这样的配置,需要暂时将该配置取消。

  • 有些系统管理员希望能够运行该工具后退出用户session,ProcDump是做不到的,如果有这种需求可以考虑使用DebugDiag。

  • 在调试High CPU问题的时候经常用到的一个命令是!runaway,但是有些时候!runway在ProcDump抓取Dump文件的过程中运行不出来,报错信息如下:

0:000> !runaway ERROR: !runaway: extension exception 0x80004002. "Unable to get thread times - dumps may not have time information"

解决的方法是将Debugging Tools for Windows (WinDbg)安装目录下的dbghelp.dll拷贝到procdump.exe所在目录下,然后再运行命令抓取Dump。 

四、WinDbg使用方法

操作步骤如下:

4.1 抓取异常程序的Dump文件

4.2 设置符号表

符号表是WinDbg关键的“数据库”,如果没有它,WinDbg基本上就是个废物,无法分析更多问题。所以使用WinDbg设置符号表,是必须要走的一步。

a、运行WinDbg软件,然后按【Ctrl+S】弹出符号表设置窗。

b、将符号表地址:SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols 粘贴在输入框中,点击确定即可。点击确定之前,请先确认红色字的文件夹是否已被新建。

注:红色字表示符号表本地存储路径,建议固定路径,可避免符号表重复下载。

4.3 学会打开第一个Dump文件

640?wx_fmt=jpeg

       

640?wx_fmt=png

 

当你拿到一个Dump文件后,可使用【Ctrl+D】快捷键来打开一个Dump文件,或者点击WinDbg界面上的【File=>Open Crash Dump...】按钮,来打开一个Dump文件。第一次打开Dump文件时,可能会收到如下提示,出现这个提示时,勾选“Don't ask again in this WinDbg session”,然后点否即可。

当你想打开第二个Dump文件时,可能因为上一个分析记录未清除,导致无法直接分析下一个Dump文件,此时你可以使用快捷键【Shift+F5】来关闭上一个对Dump文件的分析记录。

4.4 通过简单的几个命令学会分析Dump文件

分享一个数据库连接超时的Dump案例的分析过程:

当你打开一个Dump文件后,可能因为太多信息,让你无所适从,不过没关系,我们只需要关注几个关键信息就可以了。

a. 加载SOS扩展命令

加载SOS之前,先确定SOS的位置和版本,确定方法如下:

如果安装了Visual Studio,那么先按照如下步骤打开VS的命令行:

640?wx_fmt=png

640?wx_fmt=png

然后,在打开的VS命令行中输入【where sos.dll】,使获得SOS的位置和版本:

640?wx_fmt=png

 

确定完SOS位置和版本号后,开始加载SOS扩展命令:

.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll

如下图所示:

640?wx_fmt=jpeg

b. 使用!clrstack命令来查看当前的调用堆栈信息

如下图所示:

640?wx_fmt=jpeg

c. 使用!dso命令来查看堆栈上的所有对象详细信息

如下图所示:

640?wx_fmt=jpeg

综合以上分析可以大胆地猜测Common.cs 中第16行“Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=sa;Password=***”的这个数据库连接字符串应该有问题,然后到代码中相应的地方进一步确认和修改就可以了。        

五、一个真实案例

分享笔者工作过的一家公司某业务系统CPU飙高90%以上的Dump分析过程案例,步骤如下:

5.1 使用ProcDump抓包

5.2 加载SOS扩展命令

.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll

640?wx_fmt=jpeg

5.3 分析

执行!runaway命令,查看线程使用CPU时间情况,如下图所示。着重分析前面几个线程。 


执行~22s命令,进入到线程22,如下图所示:

640?wx_fmt=jpeg

执行!clrstack命令查看当前线程堆栈变量值的信息,从图中可以猜出大概是ExecuteNonQuery()这方法有点问题,如下图所示:

640?wx_fmt=jpeg

再执行!dso命令可以查看堆栈上的所有对象详细信息,如下图所示:

640?wx_fmt=png

从图中看,造成CPU飙高的罪魁祸首多半由SQL Server执行

INSERT INTO [dbo].[tbl_Interface_ProcessLog] (IKey,Username,ClientIP,Module,OrderNo,LogType,Content) VALUES (@IKey,@Username,@ClientIP,@Module,@OrderNo,@LogType,@Content)

这条语句时产生异常引起,然后到源代码中找出相应的语句,经过进一步的确认、修改和重新发布后就解决了CPU飙高的问题。

 至此,掌握几个简单的WinDbg命令之后,基本上绝大多数Dump大家都可以独立分析了。当然WinDbg是个强大的工具,同时产生CPU飙高和内存泄漏的原因也有很多。如果想分析得足够准确,那么就只有多学多练,多去分析。因为掌握WinDbg分析除了需要懂得几个命令之外,经验更加重要,最后再补充两点:

  1. WinDbg不是专门用于调试.NET程序的工具,它更偏向于底层,可用于内核和驱动调试,特别是对于某些相当疑难的问题调试有所帮助,例如内存泄漏等问题。进行普通的.NET程序调试还是使用微软专为.NET开发所提供的调试工具更方便一些。

  1. SOS扩展命令中最有用的命令是!help,使用该命令可以列出所有可用的SOS扩展命令列表,使用!help [SOSCommandName]可以查看每一个具体扩展命令的详细使用说明。例如!help dumpheap就可以查看!dumpheap这个扩展命令的具体使用方法。多多利用!help命令可以很快上手SOS。

六、Demo下载及更多资料

  • WinDbgTest下载地址:https://github.com/das2017/WinDbgTest

  • WinDbg官网:http://www.windbg.org/

  • ProcDump v9.0官网:https://technet.microsoft.com/en-us/sysinternals/dd996900.aspx

原文地址:https://www.cnblogs.com/dotnet-arch-system/p/10213539.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg


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

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

相关文章

多项式的基础操作(逆元/除法/取模/对数ln/开根sqrt/指数exp/快速幂)带模板+luogu全套例题

文章目录多项式的逆元理论推导模板例题&#xff1a;[luogu P4238]【模板】多项式乘法逆题目code多项式的除法/取模理论推导多项式牛顿迭代法模板例题&#xff1a;[luoguP4512]【模板】多项式除法题目code多项式对数ln理论推导模板例题题目code多项式开根sqrt理论推导模板例题题…

P1232-[NOI2013]树的计数【思维】

正题 题目链接:https://www.luogu.com.cn/problem/P1232 题目大意 给出nnn个点的树的dfsdfsdfs序和bfsbfsbfs序&#xff0c;求所有合法的树的平均深度。 1≤n≤21051\leq n\leq 2\times 10^51≤n≤2105 解题思路 bfsbfsbfs应该是最好开始考虑的&#xff0c;因为bfsbfsbfs序的…

Wizard of Orz CodeForces - 1467A

Wizard of Orz CodeForces - 1467A 题意&#xff1a; 有个长度为n初始状态下各元素均为0的数组&#xff0c;没过一秒数组中所有元素都会1&#xff0c;如果是9则会变成0&#xff0c;即0-9不断循环。现在你能够在开始后的任意时间点选取任意一个位置&#xff0c;改位置上的数字…

从软件工程的角度解读任正非的新年公开信

昨天被任正非的那封《全面提升软件工程能力与实践&#xff0c;打造可信的高质量产品》的公开信刷屏了&#xff0c;作为一个软件工程专业科班出身的软件开发从业者&#xff0c;自然是引起了我&#xff08;宝玉xp&#xff09;的好奇&#xff0c;仔细阅读之下确实让我大吃一惊&…

YBTOJ:矛盾指数(网络流-最大权闭合图)

文章目录题目描述解析代码网络流要大胆建图 题目描述 公司内部共nnn个员工&#xff0c;员工之间可能有矛盾。若员工uuu和员工vvv有矛盾&#xff0c;用边(u,v)(u,v)(u,v)表示&#xff0c;共mmm个矛盾。 现在公司决定裁员&#xff0c;使得被裁人员间的矛盾指数最高。矛盾指数定…

行列式、LGV、矩阵树学习笔记

前置知识&#xff1a;矩阵、高斯消元 行列式 行列式定义 \[\text{det(A)}\sum_{p}{(-1)^{\mathrm{sgn}(p)}\prod{A_{i,p_i}}} \]其中 \(\text{sgn}(p)\) 表示排列 \(p\) 的逆序对个数。 行列式性质 进行一次矩阵转职&#xff0c;行列式不变。(易证)行列式任意一行按比例扩大&am…

P5008-[yLOI2018]锦鲤抄【tarjan】

正题 题目链接:https://www.luogu.com.cn/problem/P5008 题目大意 给出nnn个点mmm条边的一张有向无环图&#xff0c;你每次可以选择一个有入度的点获取其点权然后删除这个点。求能取kkk次的情况下最大能获得的权值和。 1≤n≤51054,1≤m≤210641\leq n\leq 5\times 10^54,1\l…

Hills And Valleys CodeForces - 1467B

Hills And Valleys CodeForces - 1467B 题意&#xff1a; 修改数列中的 一个 数字 使得峰(波峰、波谷)的数量最少 题解&#xff1a; 修改一个数&#xff0c;最多只能影响左右两个数&#xff0c;所能减少的峰的数量为1,2&#xff0c;3三种 分类讨论&#xff0c;对于当前位置…

HttpClient在.NET Core中的正确打开方式

问题来源长期以来&#xff0c;.NET开发者都通过下面的方式发送http请求&#xff1a;using (var httpClient new HttpClient()){var response await httpClient.GetAsync(uri);//do something with response}这段代码理论上来说遵守了C#的最佳实践&#xff0c;HttpClient是IDi…

YBTOJ:炮塔攻击(网络流)

题目描述 小明最近在玩一款很好玩的游戏&#xff0c;游戏规则是这样的&#xff1a; 有一个n∗mn*mn∗m的地图&#xff0c;地图上的每一个位置要么是空地&#xff0c;要么是炮塔&#xff0c;要么是一些敌人&#xff0c;小明需要操纵炮塔攻击敌人。 攻击方法是&#xff1a;对于…

[CQOI]九连环(FFT优化+高精)

文章目录题目题解code题目 九连环是一种源于中国的传统智力游戏。 如图所示&#xff0c;九个的圆环套在一把“剑”上&#xff0c;并且互相牵连。游戏的目标是把九个圆环全部从“剑”上卸下。 圆环的装卸需要遵守两个规则 1&#xff0e;第一个&#xff08;最右边&#xff09;环…

牛客挑战赛53G-同源数组(Easy Version)【NTT】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11193/G 题目大意 给出nnn个长度为mmm的数组&#xff0c;然后你每次可以进行差分&#xff08;不会改变数组长度那种&#xff09;和前缀和。 如果两个数组可以在模998244353998244353998244353意义下操作成同一个数组&…

莫比乌斯反演 做题记录

来自Peterwuyihong 的题单。 前置知识 前置芝士1 数论分块 UVA11526 H(n) P2261 [CQOI2007]余数求和 P2260 [清华集训2012]模积和 其中有一个式子需要注意一下&#xff1a;\[\sum_{i1}^n\sum_{j1}^m\left\lfloor\dfrac{n}{i}\right\rfloor\left\lfloor\dfrac{m}{i}\right\rfloo…

Three Bags CodeForces - 1467C

题意&#xff1a; 三堆石子&#xff0c;你可以取两堆石子各一个石头a,b。然后消掉a&#xff0c;使得bb-a再放入b的那一堆。这样操作直到只剩下一个石子&#xff0c;求该石子价值最大。 题解&#xff1a; 构造题 可以构造出两者情况&#xff1a; 其中两堆都是正的&#xff0…

任正非公开信:投入 20 亿美元全面提升华为软件质量

昨天&#xff0c;华为心声社区发布了来自任正非的公开信《全面提升软件工程能力与实践&#xff0c;打造可信的高质量产品》&#xff0c;信中强调从基础代码做起&#xff0c;全面提升华为软件工程能力和实践&#xff0c;其中提到一些重要举措&#xff0c;包括编码质量、架构设计…

YBTOJ洛谷P2223:软件开发(费用流)

文章目录题目描述解析代码题目描述 某软件公司正在规划一项nnn天的软件开发计划&#xff0c;根据开发计划第iii天需要nin_ini​个软件开发人员&#xff0c;为了提高软件开发人员的效率&#xff0c;公司给软件人员提供了很多的服务&#xff0c;其中一项服务就是要为每个开发人员…

高维前缀和

高维前缀和 主要内容 昨天(\(\texttt{2022.2.28}\))打 ARC 的 D 题时&#xff0c;恍然发现我不会高维前缀和&#xff0c;匆匆来学一下。 比如二维前缀和 \(s_{i,j}\) 表示在一个二维平面上从 \((1,1)\) 到 \((i,j)\) 的所有点的权值之和&#xff0c;我们定义高维前缀和 \(s_{p_…

P3577-[POI2014]TUR-Tourism【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3577 题目大意 给出nnn个点mmm条边的一张图&#xff0c;每个点有费用CiC_iCi​&#xff0c;求选出费用和最小的点使得每个点都至少有一个相邻的点&#xff08;或自己&#xff09;被选择。保证图上不存在超过101010个点的简单…

[指数型生成函数专练]chocolate,红色病毒问题,排列组合,字串数

文章目录T1&#xff1a;chocolate题目题解codeT2&#xff1a;“红色病毒”问题题目题解codeT3&#xff1a;排列组合题目题解codeT4&#xff1a;字串数题解codeT1&#xff1a;chocolate 题目 已帮大家翻译了&#xff0c;不要去UVA或者luogu上面交&#xff0c;卡精度&#xff0…

微服务之:从零搭建ocelot网关和consul集群

介绍微服务中有关键的几项技术&#xff0c;其中网关和服务服务发现&#xff0c;服务注册相辅相成。首先解释几个本次教程中需要的术语网关 Gateway&#xff08;API GW / API 网关&#xff09;&#xff0c;顾名思义&#xff0c;是企业 IT 在系统边界上提供给外部访问内部接口服务…