一:背景

1. 讲故事

今天分享的dump是训练营里一位学员的,从一个啥也不会到现在分析的有模有样,真的是看他成长起来的,调试技术学会了就是真真实实自己的,话不多说,上windbg说话。

二:WinDbg 分析

1. 为什么会卡死

这位学员是从事工控大类下的视觉自动化,也是目前.NET的主战场,这个场景下大多都是WPF或者WinForm程序,不管是什么程序,先用命令 k 开路。


0:000> ~0s
ntdll!NtWaitForMultipleObjects+0x14:
00007ff8`d825cc14 c3 ret
0:000> k
# Child-SP RetAddr Call Site
00 000000e4`c0cf87e8 00007ff8`d54f7ff7 ntdll!NtWaitForMultipleObjects+0x14
01 000000e4`c0cf87f0 00007ff8`83aa7585 KERNELBASE!WaitForMultipleObjectsEx+0x107
02 000000e4`c0cf8af0 00007ff8`83aa76fa PylonBase_v5_1!Pylon::CInstantCameraArray::DestroyInstantCamera+0x78da1
03 000000e4`c0cf8bb0 00007ff8`83a188bc PylonBase_v5_1!Pylon::CInstantCameraArray::DestroyInstantCamera+0x78f16
04 000000e4`c0cf8c30 00007ff8`83a22a70 PylonBase_v5_1!Pylon::CGrabResultPtr::IsUnique+0x16ec
05 000000e4`c0cf8cd0 00007ff8`41fee2dd PylonBase_v5_1!Pylon::CGrabResultPtr::IsUnique+0xb8a0
06 000000e4`c0cf8d40 00007ff8`4218711b 0x00007ff8`41fee2dd
...

从卦象看真的很不吉利,因为这个等待是一个第三方的SDK库,从 DestroyInstantCamera 名字看就是 立即销毁相机,接下来我们看下 PylonBase_v5_1 是何方圣神?


0:000> lmvm PylonBase_v5_1
Browse full module list
start end module name
00007ff8`839e0000 00007ff8`83b5b000 PylonBase_v5_1 (export symbols) PylonBase_v5_1.dll
Loaded symbol image file: PylonBase_v5_1.dll
Image path: C:\Program Files\Basler\pylon 5\Runtime\x64\PylonBase_v5_1.dll
Image name: PylonBase_v5_1.dll
Browse all global symbols functions data
Timestamp: Fri Aug 24 20:41:55 2018 (5B7FFD13)
CheckSum: 0017E66C
ImageSize: 0017B000
File version: 5.1.0.12681
Product version: 5.1.0.12681
File flags: 0 (Mask 3F)
File OS: 40004 NT Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0000.04b0
Information from resource tables:
CompanyName: Basler
ProductName: Basler pylon
InternalName: PylonBase
OriginalFilename: PylonBase.dll
ProductVersion: 5.1.0.12681
FileVersion: 5.1.0.12681
PrivateBuild:
SpecialBuild: 0
FileDescription: PylonBase Module
LegalCopyright: Copyright (c) 2006-2018 Basler AG - All rights reserved.
LegalTrademarks:
Comments: 1d4ccf9b36037580c4655fde004335702d90d3e8

由于我是行外人,所以我好奇的查一下 Basler 是什么公司,哈,截图如下:

再回过头来看,为什么会在这里被卡呢?这个库是商业产品没有pdb的,看汇编很难推进,索性就从线程栈中逆向推测,即从 NtWaitForMultipleObjects 方法入手。

2. 如何解读 NtWaitForMultipleObjects

这个方法是微软公开的方法,和C#的 Task.WaitAny 功能等价,在 MSDN 上可以看到它的签名信息。


DWORD WaitForMultipleObjects(
[in] DWORD nCount,
[in] const HANDLE *lpHandles,
[in] BOOL bWaitAll,
[in] DWORD dwMilliseconds
);

接下来就是提取 lpHandles 中的 handle 值,看下这个 handle 到底是什么类型,再图后续方向,根据x64调用协定,只需要提取 rdx 参数即可。


0:000> r
rax=000000000000005b rbx=0000000000000001 rcx=0000000000000001
rdx=000000e4c0cf8b58 rsi=0000000000000000 rdi=0000000000000001
rip=00007ff8d825cc14 rsp=000000e4c0cf87e8 rbp=000000e4c0cf8c00
r8=000002aedcc62701 r9=ffffffffffffffe8 r10=000002ae86a12580
r11=000000e4c0cf8680 r12=00000000fffffffe r13=000000e4c0cf8b58
r14=000000e4c0cf8840 r15=0000000000000000
iopl=0 nv up ei pl zr na po nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
ntdll!NtWaitForMultipleObjects+0x14:
00007ff8`d825cc14 c3 ret 0:000> !handle poi(000000e4c0cf8b58) f
Handle 0000000000001790
Type Thread
Attributes 0
GrantedAccess 0x1fffff:
Delete,ReadControl,WriteDac,WriteOwner,Synch
Terminate,Suspend,Alert,GetContext,SetContext,SetInfo,QueryInfo,SetToken,Impersonate,DirectImpersonate
HandleCount 6
PointerCount 201480
Name <none>
Object specific information
Thread Id 4714.ff4
Priority 10
Base Priority 0

从卦中数据看,居然是一个线程句柄,而且信息 Thread Id 4714.ff4也标出来了,真tmd的是 山重水复疑无路,柳暗花明又一村 。。。

3. f44号线程正在做什么

有了线索之后,后面就是顺藤摸瓜了,先切到 f44 号线程。


0:137> !clrstack
OS Thread Id: 0xff4 (137)
Child SP IP Call Site
000000e4c53fd418 00007ff8d825cc14 [GCFrame: 000000e4c53fd418]
000000e4c53fd610 00007ff8d825cc14 [GCFrame: 000000e4c53fd610]
000000e4c53fd668 00007ff8d825cc14 [HelperMethodFrame: 000000e4c53fd668] System.Threading.Monitor.Enter(System.Object)
000000e4c53fd760 00007ff84218d827 Basler.xxx.OnImageGrabbed(System.Object, Basler.Pylon.ImageGrabbedEventArgs)
...

从卦象看,这个线程正在 lock锁上等待,那这个lock锁被谁持有着呢?这个就比较简单了,查看下同步块索引即可。


0:137> !syncblk
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
321 000002ae81012218 7 1 000002ae83701520 2e74 57 000002aedea354e8 System.Object

卦中的 2e74号线程正是持有锁,接下来就是探究下 2e74号线程此时正在干什么?

4. 2e74号线程正在干什么

一路摸瓜,有种预感马上就能看到光了,切到这个线程继续观察。


0:057> !clrstack
OS Thread Id: 0x2e74 (57)
Child SP IP Call Site
000000e4c4efcdb8 00007ff8d825cc14 [HelperMethodFrame_1OBJ: 000000e4c4efcdb8] System.Threading.WaitHandle.WaitOneNative(System.Runtime.InteropServices.SafeHandle, UInt32, Boolean, Boolean)
000000e4c4efcee0 00007ff89ed99ccc System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\waithandle.cs @ 243]
000000e4c4efcf10 00007ff89ed99c9f System.Threading.WaitHandle.WaitOne(Int32, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\waithandle.cs @ 194]
000000e4c4efcf50 00007ff89af8ac84 System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle)
000000e4c4efcfc0 00007ff89a7f3264 System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean)
000000e4c4efd100 00007ff89af8e4a4 System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[])
000000e4c4efd170 00007ff84219c223 xxx.MCamera_RetrieveImageCompleted1(System.Object, System.EventArgs)
...

从卦中看这个线程正在用 Invoke 给主线程的 Queue 塞数据,并等待主线程的提取唤醒,所以这是一个经典的 三角循环死锁

有了完整的前因后果之后,改动方案就比较简单了。

  • Invoke 改成 BeginInvoke
  • 缩小 lock 的粒度

三:总结

这个dump所呈现的 三角循环死锁 还是非常经典的,更开心的是这位学员的分析能力已经出了新手村。。。

记一次 .NET某工控视觉自动化系统 卡死分析的更多相关文章

  1. 记一次 .NET 某工控自动化控制系统 卡死分析

    一:背景 1. 讲故事 前段时间遇到了好几起关于窗体程序的 进程加载锁 引发的 程序卡死 和 线程暴涨 问题,这种 dump 分析难度较大,主要涉及到 Windows操作系统 和 C++ 的基础知识, ...

  2. 记一次 .NET 某工控视觉软件 非托管泄漏分析

    一:背景 1.讲故事 最近分享了好几篇关于 非托管内存泄漏 的文章,有时候就是这么神奇,来求助的都是这类型的dump,一饮一啄,莫非前定.让我被迫加深对 NT堆, 页堆 的理解,这一篇就给大家再带来一 ...

  3. 记一次 .NET 某工控软件 内存泄露分析

    一:背景 1.讲故事 上个月 .NET调试训练营 里的一位老朋友给我发了一个 8G 的dump文件,说他的程序内存泄露了,一时也没找出来是哪里的问题,让我帮忙看下到底是怎么回事,毕竟有了一些调试功底也 ...

  4. 记一次 .NET 某工控MES程序 崩溃分析

    一:背景 1.讲故事 前几天有位朋友找到我,说他的程序出现了偶发性崩溃,已经抓到了dump文件,Windows事件日志显示的崩溃点在 clr.dll 中,让我帮忙看下是怎么回事,那到底怎么回事呢? 上 ...

  5. 记一次 .NET 某工控数据采集平台 线程数 爆高分析

    一:背景 1. 讲故事 前几天有位朋友在 B站 加到我,说他的程序出现了 线程数 爆高的问题,让我帮忙看一下怎么回事,截图如下: 说来也奇怪,这些天碰到了好几起关于线程数无缘无故的爆高,不过那几个问题 ...

  6. 记一次 .NET 某企业OA后端服务 卡死分析

    一:背景 1.讲故事 前段时间有位朋友微信找到我,说他生产机器上的 Console 服务看起来像是卡死了,也不生成日志,对方也收不到我的httpclient请求,不知道程序出现什么情况了,特来寻求帮助 ...

  7. 记一次 .NET某医疗器械清洗系统 卡死分析

    一:背景 1. 讲故事 前段时间协助训练营里的一位朋友分析了一个程序卡死的问题,回过头来看这个案例比较经典,这篇稍微整理一下供后来者少踩坑吧. 二:WinDbg 分析 1. 为什么会卡死 因为是窗体程 ...

  8. 记一次 .NET 某物管后台服务 卡死分析

    一:背景 1. 讲故事 这几个月经常被朋友问,为什么不更新这个系列了,哈哈,确实停了好久,主要还是打基础去了,分析 dump 的能力不在于会灵活使用 windbg,而是对底层知识有一个深厚的理解,比如 ...

  9. 开源纯C#工控网关+组态软件(十)移植到.NET Core

    一.   引子 写这个开源系列已经十来篇了.自从十年前注册博客园以来,关注了张善友.老赵.xiaotie.深蓝色右手等一众大牛,也围观了逗比的吉日嘎啦.精密顽石等形形色色的园友.然而整整十年一篇文章都 ...

  10. Wireshark工控协议

    Wireshark是一个强大开源流量与协议分析工具,除了传统网络协议解码外,还支持众多主流和标准工控协议的分析与解码. 序号 协议类型 源码下载 简介 1 Siemens S7 https://git ...

随机推荐

  1. ES6中新增的Set、Map两种数据结构

    如果要用一句话来描述,我们可以说 Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构 什么是集合?什么又是字典? 集合是由一堆无序的.相关联的,且不重复的内存结构[数学中称为元素]组成的组 ...

  2. css 中的BFC

    一.是什么 我们在页面布局的时候,经常出现以下情况: 这个元素高度怎么没了? 这两栏布局怎么没法自适应? 这两个元素的间距怎么有点奇怪的样子? ...... 归根究底是元素之间相互的影响,导致了意料之 ...

  3. 力扣608(MySQL)-树节点(中等)

    题目: 给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id . 树中每个节点属于以下三种类型之一: 叶子:如果这个节点没有任何孩子节点.根:如果这个节点是整棵树的根,即没有父节 ...

  4. EasyNLP带你实现中英文机器阅读理解

    简介: 本⽂将提供对MacBERT模型的技术解读,以及如何在EasyNLP框架中使⽤MacBERT及其他预训练语言模型,进行中英文机器阅读理解任务的训练与预测. 作者:施晨.黄俊 导读 机器阅读理解是 ...

  5. 平行云CEO 李岩:CloudXR ,开启通往元宇宙的通道

    ​简介:一端是算力无穷的云,这也是 CloudXR 的精髓所在. ​ 图:2022阿里云视觉计算私享会现场 5月11日,在"2022阿里云视觉计算私享会"上,平行云CEO李岩为大家 ...

  6. PolarDB for PostgreSQL 内核解读 :HTAP架构介绍

    简介:在 PolarDB 存储计算分离的架构基础上我们研发了基于共享存储的MPP架构步具备了 HTAP 的能力,对一套 TP的数据支持两套执行引擎:单机执行引擎用于处理高并发的 OLTP:MPP跨机分 ...

  7. MySQL 8.0 Server层最新架构详解

    简介: 本文基于MySQL 8.0.25源码进行分析和总结.这里MySQL Server层指的是MySQL的优化器.执行器部分.我们对MySQL的理解还建立在5.6和5.7版本的理解之上,更多的是对比 ...

  8. 快速界定故障:Socket Tracer网络监控实践

    ​ 简介: Socket Tracer定位是传输层(Socket&TCP)的指标采集工具,通过补齐网络监控的这部分盲区,来达到快速界定网络问题的目标. ​ 作者 | 四忌 来源 | 阿里技术公 ...

  9. [FAQ] mogodb Robo3T 客户端全屏后 怎么退出全屏

    mongodb 的 Robo3T 客户端: 如果是不小心全屏了,不用担心,按 F11 恢复. 如果想要全屏,也是按 F11. Link:https://www.cnblogs.com/farwish/ ...

  10. Microsoft SQL Server 自定义函数整理大全

    https://www.cnblogs.com/ybb521/p/3210271.html