一:背景 1.讲故事 上个月有个朋友在微信上找到我,说他们的软件在客户那边隔几天就要崩溃一次,一直都没有找到原因,让我帮忙看下怎么回事,确实工控类的软件环境复杂难搞,朋友手上有一个崩溃的dump,刚好丢给我来分析一下。 二:WinDbg分析 1.程序为什么会崩溃 windbg有一个厉害之处在于双击之后可以帮你自动定位到崩溃处,输出如下: ................................................................ ...................................................................

  eN9dsiqvgeuP   12天前   20   0   0 .NET

一:背景 1.讲故事 前些天有位朋友微信找到我,说他们的WPF程序有内存泄漏的情况,让我帮忙看下怎么回事?并且dump也抓到了,网上关于程序内存泄漏,内存暴涨的文章不计其数,看样子这个dump不是很好分析,不管怎么说,上windbg说话。 二:WinDbg分析 1.内存真的暴涨吗 在.NET调试训练营中我一直强调要相信数据,不要相信别人的一面之词,往往会把你带到沟里去,接下来使用!address-summary观察下提交内存。 0:000>!address-summary --UsageSummary---------------RgnCount----------TotalSize...

  eN9dsiqvgeuP   22天前   23   0   0 .NET

一:背景 1.讲故事 昨晚给训练营里面的一位朋友分析了一个程序崩溃的故障,因为看小伙子昨天在群里问了一天也没搞定,干脆自己亲自上阵吧,抓取的dump也是我极力推荐的用procdump注册AEDebug的方式,省去了很多沟通成本。 二:WinDbg分析 1.为什么会崩溃 windbg有一个非常强大的点就是当你双击打开后,会自动帮你切换到崩溃的线程以及崩溃处的汇编代码,省去了!analyze-v命令的龟速输出,参考信息如下: ................................................................ ........................

  eN9dsiqvgeuP   2024年03月28日   29   0   0 .NET

一:背景 1.讲故事 前些天有一位朋友在公众号上找到我,说他们的WinForm程序部署在20多台机器上,只有两台机器上的程序会出现崩溃的情况,自己找了好久也没分析出来,让我帮忙看下怎么回事,就喜欢这些有点调试基础的,dump也不需要我指导怎么去抓,接下来我们就上windbg开始分析吧。 二:WinDbg分析 1.为什么会崩溃 寻找崩溃的表象比较简单,使用windbg的!analyze-v命令即可。 0:000>!analyze-v ... EXCEPTION_RECORD:(.exr-1) ExceptionAddress:0000000000000000 ExceptionCode:...

  eN9dsiqvgeuP   2024年03月25日   50   0   0 .NET

一:背景 1.讲故事 前几天有位朋友找到我,说他们的API服务程序跑着跑着CPU满了降不下去,让我帮忙看下怎么回事,现在貌似民间只有我一个人专注dump分析,还是申明一下我dump分析是免费的,如果想学习.NET高级调试的分析技术,可以来我的训练营看看,话不多说,dump分析走起! 二:WinDbg分析 1.CPU真的爆高吗 昨天录了一个小视频,大意就是作为分析师,不要过分的相信客户说的话,他们往往会把你带偏,你要有自己的分析思路和前进方向,所以需要以数据说话,首先用!tp观察下线程池。 0:030>!tp CPUutilization:60% WorkerThread:Total:1...

  eN9dsiqvgeuP   2024年03月21日   44   0   0 .NET

一:背景 1.讲故事 先说一下题外话,一个监控别人系统运行状态的程序,结果自己出问题了,有时候想一想还是挺讽刺的,哈哈,开个玩笑,我们回到正题,前些天有位朋友找到我,说他们的系统会偶发性CPU爆高,CPU上去了就下不来了,让我帮忙看一下怎么回事,而且自己也分析过了,没找到哪里有问题,写监控的都是高手,给我的第一感觉就是这个dump可能解决起来不容易,不管怎么说,有了dump就开干吧! 二:WinDbg分析 1.CPU真的爆高吗 作为调试人,第一准则就是不要轻信任何人透露给你的信息,因为人家在这块是一个小白,往往他的信息会把你带偏,我们只相信数据即可,切记!!!所以我们先用!tp观察下CPU使用...

  eN9dsiqvgeuP   2024年03月06日   26   0   0 .NET

一:背景 1.讲故事 很多.NET开发者在学习高级调试的时候,使用sos的命令输出会发现这里也看不懂那里也看不懂,比如截图中的这位朋友。 .NET高级调试属于一个偏冷门的领域,国内可观测的资料比较少,所以很多东西需要你自己去探究源代码,然后用各种调试工具去验证,相关源代码如下: coreclr:https://github.com/dotnet/runtime windows:https://github.com/reactos/reactos linux:https://www.kernel.org/ 这一篇权当抛砖引玉,来引导一下如何去探索。 二:WinDbg分析 1.复原现象 为了...

  eN9dsiqvgeuP   2024年02月26日   41   0   0 .NET

一:背景 1.讲故事 过年喝了不少酒,脑子不灵光了,停了将近一个月没写博客,今天就当新年开工写一篇吧。 去年年初有位朋友找到我,说他们的系统会偶发性崩溃,在网上也发了不少帖子求助,没找到自己满意的答案,让我看看有没有什么线索,看样子这是一个牛皮藓的问题,既然对方有了dump,那就分析起来吧。 二:WinDbg分析 1.为什么会崩溃 不管是windows还是linux上的.net程序崩溃都会存在异常码,前者是ExceptionCode,后者是SignalCode,所以先用!analyze-v观察看看。 0:003>!analyze-v CONTEXT:(.ecxr) eax=000000...

  eN9dsiqvgeuP   2024年02月21日   39   0   0 .NET

一:背景 1.讲故事 前些天微信上有位朋友找到我,说他的程序偶发崩溃,分析了个把星期也没找到问题,耗费了不少人力物力,让我能不能帮他看一下,给我申请了经费,哈哈,遇到这样的朋友就是爽快,刚好周二晚上给调试训练营的朋友分享GC标记阶段相关知识,而这个dump所展示的问题是对这块知识的一个很好的巩固,接下来我们开始分析吧。 二:WinDbg分析 1.为什么会崩溃 要想找到崩溃原因,还是用老命令!analyze-v,输出如下: 0:005>!analyze-v CONTEXT:(.ecxr) eax=063ce258ebx=07b90000ecx=0063552eedx=0063552ees...

  eN9dsiqvgeuP   2024年01月26日   17   0   0 .NET

一:背景 1.讲故事 这个问题的由来是在.NET高级调试训练营第十期分享ThreadStatic底层玩法的时候,有朋友提出了AsyncLocal是如何实现的,虽然做了口头上的表述,但总还是会不具体,所以觉得有必要用文字+图表的方式来系统的说一下这个问题。 二:AsyncLocal线程间传值 1.线程间传值途径 在C编程中实现多线程以及线程切换的方式大概如下三种: Thread Task await,async 这三种场景下的线程间传值有各自的实现方式,由于篇幅限制,先从Thread开始聊吧。本质上来说AsyncLocal是一个纯托管的C玩法,和coreclr,Windows没有任何关系。 ...

  eN9dsiqvgeuP   2024年01月25日   18   0   0 .NET

一:背景 1.讲故事 有朋友在微信里面问我,为什么用ThreadStatic标记的字段,只有第一个线程拿到了初始值,其他线程都是默认值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给后面类似疑问的朋友解个惑吧。 二:为什么值不一样 1.问题复现 为了方便讲述,定义一个ThreadStatic的变量,然后用多个线程去访问,参考代码如下: internalclassProgram { [ThreadStatic] publicstaticintnum=10; staticvoidMain(string[]args) { Test(); Console...

  eN9dsiqvgeuP   2024年01月23日   17   0   0 .NET

一:背景 1.讲故事 前些天有位朋友在微信上找到我,说他们的客户端程序卡死了,让我帮忙看下是什么原因导致的?dump也拿到了手,既然有了dump就开始正式分析吧。 二:WinDbg分析 1.什么导致的卡死 客户端的程序卡死比较好找原因,入手点就是主线程,看下它此时正在做什么,可以用k命令。 0:000>k ChildEBPRetAddr 00003cdf7c74c115centdll!NtWaitForSingleObject+0x15 01003cdf7c756e1194KERNELBASE!WaitForSingleObjectEx+0x98 02003cdf946f573beak...

  eN9dsiqvgeuP   2024年01月20日   17   0   0 .NET

一:背景 1.讲故事 前些天有位朋友找到我,说他的程序几天内存就要爆一次,不知道咋回事,找不出原因,让我帮忙看一下,这种问题分析dump是最简单粗暴了,拿到dump后接下来就是一顿分析。 二:WinDbg分析 1.程序为什么会暴 程序既然会爆,可能是虚拟地址受限,也可能是系统内存不足,可以用!address-summary观察下。 0:037>!address-summary --UsageSummary---------------RgnCount----------TotalSize-------%ofBusy%ofTotal <unknown>86653577000(...

  eN9dsiqvgeuP   2024年01月20日   12   0   0 .NET

一:背景 1.讲故事 在我的分析之旅中,遇到过很多程序的故障和杀毒软件扯上了关系,有杀毒软件导致的程序卡死,有杀毒软件导致的程序崩溃,这一篇又出现了一个杀毒软件导致的程序非托管内存泄露,真的是分析多了什么鬼都能撞上。 前几天有位朋友找到过,我他们的程序内存在慢慢的泄露,最后程序会出现崩溃,不知道是什么导致的,让我帮忙看一下怎么回事,简单分析后发现是非托管泄露,让朋友开启了ust并在内存超出预期时抓了一个dump下来,接下来就是分析了。 二:WinDbg分析 1.到底是哪里的泄露 相信一直追这个系统的朋友应该知道怎么判断,很简单,看下MEM_COMMIT和HEAP指标即可,使用!address-...

  eN9dsiqvgeuP   2024年01月12日   14   0   0 .NET

一:背景 1.讲故事 有朋友在后台留言让我说一下C的ThreadStatic线程本地存储是怎么玩的?这么说吧,C的ThreadStatic是假的,因为C完全是由CLR(C)承载的,言外之意C的线程本地存储,用的就是用C运行时提供的__declspec(thread)或__thread来虚构的一套玩法,这一篇我们就来简单聊一聊。 二:C的线程本地存储 1.虚构在哪里 在C中使用ThreadStatic就可以将变量和线程进行绑定,参考代码如下: internalclassProgram { [ThreadStatic] publicstaticintnum=10; staticvoidMain...

  eN9dsiqvgeuP   2024年01月06日   15   0   0 .NET

一:背景 1.讲故事 在dump分析的旅程中也会碰到一些让我无法解释的灵异现象,追过这个系列的朋友应该知道,上一篇我聊过宇宙射线导致的程序崩溃,后来我又发现了一例,而这一例恰恰是高铁的列控连锁一体化程序,所以更加让我确定这是由于电离辐射干扰了计算机的数字信号导致程序的bit翻转,而这一篇也是一个我认为的灵异现象,拿出来给朋友们分享一下。 前段时间有位朋友找到我,说他的程序会偶发性崩溃,一直找不到原因很纠结,看我在这一块非常有经验让我帮忙看一下怎么回事,既然是有备而来自然dump也准备好了,接下来开始分析之旅吧。 二:WinDbg分析 1.为什么会崩溃 要想分析崩溃的原因还得windbg自带的自...

  eN9dsiqvgeuP   2024年01月04日   14   0   0 .NET

一:背景 1.讲故事 前些天有位朋友找到我,说他程序中的线程数爆高,让我帮忙看下怎么回事,这种线程数爆高的情况找问题相对比较容易,就让朋友丢一个dump给我,看看便知。 二:为什么会爆高 1.查看托管线程 别人说的话不一定是真,得自己拿数据出来说话,可以用!t命令观察一下便知。 0:000>!t ThreadCount:4683 UnstartedThread:0 BackgroundThread:4663 PendingThread:0 DeadThread:19 HostedRuntime:no Lock DBGIDOSIDThreadOBJStateGCModeGCAllocCo...

  eN9dsiqvgeuP   2023年12月31日   14   0   0 .NET

一:背景 1.讲故事 这段时间分析了几个和网络故障有关的.NET程序之后,真的越来越体会到计算机基础课的重要,比如计算机网络课,如果没有对tcpip协议的深刻理解,解决这些问题真的很难,因为你只能在高层做黑盒测试,你无法看到tcp层面的握手和psh通讯。 这篇我们通过两个小例子来理解一下tcp协议在故障分析中的作用。 二:tcp协议的两个小例子 1.程序突然大量超时 这个故事起源于一位朋友遇到的问题: 起初程序跑的一直都是好好的,但会有偶发性突然无法访问,奇怪的是在故障时手工访问域名时又是正常的,后面又莫名奇怪的好了,请问这是怎么回事? 这种问题朋友虽然抓了dump,但在dump中寻找问题...

  eN9dsiqvgeuP   2023年12月31日   13   0   0 .NET

一:背景 1.讲故事 前几天有位朋友找到我,说他的窗体程序有卡死现象,让我帮忙看下怎么回事,解决这种问题就需要在卡死的时候抓一个dump下来,拿到dump之后就可以分析了。 二:为什么会卡死 1.观察主线程 窗体程序的卡死,需要观察主线程此时正在做什么,可以用!clrstack命令观察。 0:000:x86>!clrstack OSThreadId:0x4a08(0) ChildSPIPCallSite 012fe7840000002b[HelperMethodFrame_1OBJ:012fe784]System.Threading.WaitHandle.WaitOneNative(S...

  eN9dsiqvgeuP   2023年12月31日   17   0   0 .NET

一:背景 1.讲故事 前几个月有位朋友找到我,说他们的的web程序没有响应了,而且监控发现线程数特别高,内存也特别大,让我帮忙看一下怎么回事,现在回过头来几经波折,回味价值太浓了。 二:程序到底经历了什么 1.在线程上找原因 这个程序内存高,线程高,无响应,尼玛是一个复合态问题,那怎么入手呢?按经验推测,大概率是由于高线程数引发的,相信大家都知道每个线程都有自己的栈空间,所以众人拾柴火焰高,可以用!address-summary观察下线程栈空间。 0:000>!address-summary --UsageSummary---------------RgnCount---------...

  eN9dsiqvgeuP   2023年12月31日   30   0   0 .NET
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~