国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

記一次 .NET某工控視覺自動(dòng)化系統(tǒng)卡死分析

開發(fā) 前端
為什么會(huì)在這里被卡呢?這個(gè)庫是商業(yè)產(chǎn)品沒有pdb的,看匯編很難推進(jìn),索性就從線程棧中逆向推測,即從 NtWaitForMultipleObjects 方法入手。

一、背景

1. 講故事

今天分享的dump是訓(xùn)練營里一位學(xué)員的,從一個(gè)啥也不會(huì)到現(xiàn)在分析的有模有樣,真的是看他成長起來的,調(diào)試技術(shù)學(xué)會(huì)了就是真真實(shí)實(shí)自己的,話不多說,上windbg說話。

二、WinDbg 分析

1. 為什么會(huì)卡死

這位學(xué)員是從事工控大類下的視覺自動(dòng)化,也是目前.NET的主戰(zhàn)場,這個(gè)場景下大多都是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
...

從卦象看真的很不吉利,因?yàn)檫@個(gè)等待是一個(gè)第三方的SDK庫,從 DestroyInstantCamera 名字看就是 立即銷毀相機(jī),接下來我們看下 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 是什么公司,????哈,截圖如下:

圖片圖片

再回過頭來看,為什么會(huì)在這里被卡呢?這個(gè)庫是商業(yè)產(chǎn)品沒有pdb的,看匯編很難推進(jìn),索性就從線程棧中逆向推測,即從 NtWaitForMultipleObjects 方法入手。

2. 如何解讀 NtWaitForMultipleObjects

這個(gè)方法是微軟公開的方法,和C#的 Task.WaitAny 功能等價(jià),在 MSDN 上可以看到它的簽名信息。

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

接下來就是提取 lpHandles 中的 handle 值,看下這個(gè) handle 到底是什么類型,再圖后續(xù)方向,根據(jù)x64調(diào)用協(xié)定,只需要提取 rdx 參數(shù)即可。

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

從卦中數(shù)據(jù)看,居然是一個(gè)線程句柄,而且信息 Thread Id 4714.ff4也標(biāo)出來了,真tmd的是 山重水復(fù)疑無路,柳暗花明又一村 。。。

3. f44號(hào)線程正在做什么

有了線索之后,后面就是順藤摸瓜了,先切到 f44 號(hào)線程。

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)
...

從卦象看,這個(gè)線程正在 lock鎖上等待,那這個(gè)lock鎖被誰持有著呢?這個(gè)就比較簡單了,查看下同步塊索引即可。

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

卦中的 2e74號(hào)線程正是持有鎖,接下來就是探究下 2e74號(hào)線程此時(shí)正在干什么?

4. 2e74號(hào)線程正在干什么

一路摸瓜,有種預(yù)感馬上就能看到光了,切到這個(gè)線程繼續(xù)觀察。

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)
...

從卦中看這個(gè)線程正在用 Invoke 給主線程的 Queue 塞數(shù)據(jù),并等待主線程的提取喚醒,所以這是一個(gè)經(jīng)典的 三角循環(huán)死鎖。

有了完整的前因后果之后,改動(dòng)方案就比較簡單了。

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

三:總結(jié)

這個(gè)dump所呈現(xiàn)的 三角循環(huán)死鎖 還是非常經(jīng)典的,更開心的是這位學(xué)員的分析能力已經(jīng)出了新手村......

責(zé)任編輯:武曉燕 來源: 一線碼農(nóng)聊技術(shù)
相關(guān)推薦

2024-09-14 10:28:56

.NET卡死程序

2022-10-09 10:47:37

NET視覺軟件

2024-05-28 10:18:30

WPF程序數(shù)據(jù)

2024-07-01 13:00:24

.NET網(wǎng)絡(luò)邊緣計(jì)算

2024-11-29 10:06:59

2022-01-17 21:28:36

管理系統(tǒng).NET

2024-03-15 15:15:53

.NETCPU系統(tǒng)

2024-12-27 13:31:18

.NETdump調(diào)試

2023-05-15 11:15:50

.NET門診語句

2023-09-27 07:23:10

.NET監(jiān)控軟件

2024-05-20 09:39:02

.NETurl線程池

2022-10-13 18:40:05

.NETOA后端

2024-07-12 11:20:34

.NET崩潰視覺程序

2025-09-02 01:35:00

.NET光學(xué)定位軟件

2024-03-28 12:56:36

2023-04-06 10:52:18

2024-07-09 11:51:20

Windows線程池源碼

2023-06-29 17:55:00

.NET日志WinDbg

2025-10-29 01:11:00

.NET系統(tǒng)windows

2023-03-26 20:24:50

ERP網(wǎng)站系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品二区三区四区| 91超碰中文字幕久久精品| 成人黄色免费| 欧美成人免费网站| 手机亚洲手机国产手机日韩| 日韩一区不卡| 欧美日韩亚洲系列| www国产精品| 91在线看www| 国产亚洲永久域名| 国产欧美日韩亚洲精品| 日本三级在线观看网站| 中文字幕一区二区在线播放 | 99久久伊人网影院| 自拍亚洲一区| 国产福利亚洲| 亚洲区免费影片| 久草视频视频在线播放| 欧美日韩亚洲一区二区三区| 午夜探花在线观看| 久久精品国产精品青草| 亚洲自拍在线观看| 韩国v欧美v亚洲v日本v| 三级三级久久三级久久18| 亚洲免费观看高清完整版在线观| 欧美精品情趣视频| 欧美专区视频| 福利视频一区二区三区四区| 色综合久久久久综合99| 爱情岛论坛亚洲首页入口章节| 日韩视频免费| 岛国一区二区三区高清视频| 精品午夜av| 国产丝袜一区二区三区| 电影亚洲精品噜噜在线观看| 国产自产女人91一区在线观看| 国产福利图片| 国产亚洲精品资源在线26u| 精品乱码一区二区三区| 日韩大片欧美大片| 色一区在线观看| 日韩欧美亚洲一区| 成人美女视频在线看| 最近免费观看高清韩国日本大全| 午夜日韩视频| 艳母动漫在线免费观看| 精品国产成人av| 国产一区二区三区网| 黄色动漫网站入口| 在线观看91视频| 亚洲小视频在线观看| 成人黄色小视频在线观看| jizz国产精品| 国产乱码精品一区二区三区不卡| 美腿丝袜亚洲综合| 91在线视频九色| 国内精品久久久久影院薰衣草 | 国产一区二区三区天码| 小明精品国产一区二区三区| 日本免费高清一区二区| 国产91精品在线播放| 日韩黄色在线免费观看| 91成人在线精品| 中文字幕不卡在线播放| 激情综合亚洲| av网站大全在线| 精品亚洲aⅴ在线观看| 99精品偷自拍| 国产精伦一区二区三区| 99伊人久久| 欧美日韩亚洲一区二区| 美女网站久久| 欧美在线在线| jizz亚洲| 欧美爱爱视频免费看| 欧美一区二区三区……| 在线观看免费视频综合| 美女看a上一区| 日韩大片在线| 国产在线拍揄自揄视频不卡99| 欧美视频在线视频| 国产精品视屏| 国产二区一区| 国产一区二区三区美女| 日韩欧美国产片| 精品国免费一区二区三区| 久久久蜜桃精品| 中文字幕佐山爱一区二区免费| 一本一道综合狠狠老| 国产精品久久久99| 成年男女免费视频网站不卡| 久久狠狠久久综合桃花| 国产三级精品三级| 亚洲小说区图片区情欲小说| 亚洲美女www午夜| 欧美日韩夜夜| 婷婷综合影院| 亚洲一区二区三区乱码| 性欧美暴力猛交69hd| 一本到一区二区三区| 欧美日韩在线播放视频| 午夜免费性福利| 性欧美长视频免费观看不卡| 亚洲精品免费电影| 久久不见久久见免费视频7| 一本久道中文无码字幕av| 国产精品欧美日韩| 欧美一区中文字幕| 精品一区免费av| 成人在线免费观看黄色| 久久久神马电影| 欧美视频在线观看 亚洲欧| 成人爽a毛片免费啪啪红桃视频| 国产成人精品免费视频大全最热 | 国产剧情av麻豆香蕉精品| av岛国在线| 最新在线观看av| 国产欧美一区二区三区久久人妖| 亚洲欧洲日韩一区二区三区| 欧美日韩女优| 丁香婷婷激情网| 一区二区三区视频观看| 麻豆免费精品视频| 日本中文字幕中出在线| av7777777| 欧美一级高清片| 久久国产精品露脸对白| aaa国产精品视频| 久久白虎精品| 成人午夜电影在线播放| 欧美日韩一级片网站| 九九视频免费观看视频精品| www.成人精品免费网站青椒| 国产精品96久久久久久| 一区二区三区资源| 天堂精品久久久久| 五月伊人六月| 成人免费观看cn| 韩国日本不卡在线| 亚洲国产裸拍裸体视频在线观看乱了 | 日韩在线视频观看正片免费网站| 另类中文字幕网| www.欧美视频| 青檬在线电视剧在线观看| 天天成人综合网| 国产精品久久久久久久久久ktv| 久久韩剧网电视剧| 激情图片小说一区| 在线日韩视频| 黄页网站大全在线免费观看| 91黄色在线看| 欧美资源一区| 午夜精品在线视频| 日本韩国一区二区三区视频| 国产精品情趣视频| 欧美性猛交xxxx乱大交极品| 欧美日韩精品欧美日韩精品| 欧美日韩国内自拍| 精品视频一区二区不卡| 中文日韩电影网站| 国语自产精品视频在线看抢先版图片| 青草成人免费视频| 国产在线精品一区| 欧美一区二区三区电影在线观看| 精品国产乱码久久久久久丨区2区| 永久域名在线精品| 超碰在线97免费| 成年在线观看免费人视频| 伊人75在线| 中文在线а√天堂| 1024国产在线| www.欧美| 国产欧美短视频| 国产精品自拍一区| 久久精品欧美日韩| 一本到三区不卡视频| 欧美日韩激情在线| 久久亚洲精品小早川怜子66| 成人春色激情网| 国内精品国语自产拍在线观看| 先锋影音日韩| 粉嫩喷白浆久久| 高清电影一区| 在线成人动漫av| www.成人网.com| 337p亚洲精品色噜噜噜| 尤物九九久久国产精品的分类| 国产精品久久久久久影视| 国产欧美高清在线| 麻豆福利在线观看| 91麻豆精品国产综合久久久| 亚洲网站啪啪| 亚洲国产综合91精品麻豆| 亚洲成人精品在线| 97精品一区二区视频在线观看| 蜜臀av色欲a片无码精品一区| 免费h在线看| 狠狠色狠狠色合久久伊人| 欧美一区二区三区视频在线观看| 97精品国产97久久久久久免费|