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

記一次 .NET 某設備監控系統死鎖分析

開發 前端
因為是窗體程序,所以看主線程的線程棧就好了,如果卡在 用戶態? 那這個問題相對容易解決,如果卡在 內核態 這個問題就比較復雜了,需要開啟 WinDbg 的本機內核調試或者雙機調試才能找到最終的問題。

?一:背景

1. 講故事

上周看了一位訓練營朋友的dump,據朋友說他的程序卡死了,看完之后發現是一例經典的死鎖問題,蠻有意思,這個案例算是學習 .NET高級調試 入門級的案例,這里和大家分享一下。

二:WinDbg 分析

1. 程序為什么會卡死

因為是窗體程序,所以看主線程的線程棧就好了,如果卡在 用戶態? 那這個問題相對容易解決,如果卡在 內核態 這個問題就比較復雜了,需要開啟 WinDbg 的本機內核調試或者雙機調試才能找到最終的問題。

既然已經說了是入門級,那肯定是卡在 用戶態? 層面啦,我們用 !clrstack 命令觀察下主線程的線程棧即可,輸出如下:

0:000:x86> !clrstack
OS Thread Id: 0x31d8 (0)
Child SP IP Call Site
00f9ec28 00e9e108 [GCFrame: 00f9ec28]
00f9ed08 00e9e108 [GCFrame: 00f9ed08]
00f9ed24 00e9e108 [HelperMethodFrame_1OBJ: 00f9ed24] System.Threading.Monitor.ReliableEnter(System.Object, Boolean ByRef)
00f9eda0 70c08468 System.Threading.Monitor.Enter(System.Object, Boolean ByRef) [f:\dd\ndp\clr\src\BCL\system\threading\monitor.cs @ 62]
00f9edb0 0ce916c7 xxxx.GetAlarmCount(xxx)
00f9ee28 0961f41f xxx.xxx()
00f9ef04 0961d60a xxxx.xxx(System.Object, System.EventArgs)
00f9ef50 6de03dc9 System.Windows.Forms.Timer.OnTick(System.EventArgs)
00f9ef58 6de053d9 System.Windows.Forms.Timer+TimerNativeWindow.WndProc(System.Windows.Forms.Message ByRef)
00f9ef64 6ddd38d0 System.Windows.Forms.NativeWindow.Callback(IntPtr, Int32, IntPtr, IntPtr)
00f9f1b0 0130d5d4 [InlinedCallFrame: 00f9f1b0]
00f9f1ac 6de375bd DomainBoundILStubClass.IL_STUB_PInvoke(MSG ByRef)
00f9f1b0 6dde44e3 [InlinedCallFrame: 00f9f1b0] System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef)
00f9f1e4 6dde44e3 System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32)
00f9f1e8 6dde40d1 [InlinedCallFrame: 00f9f1e8]
00f9f270 6dde40d1 System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext)
00f9f2c0 6dde3f23 System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext)
00f9f2ec 6ddbc83d System.Windows.Forms.Application.Run(System.Windows.Forms.Form)
00f9f300 01350a6e CleanControl.Program.Main(System.String[])
00f9f4ec 71d00556 [GCFrame: 00f9f4ec]
...

從卦中看,主線程卡在 Monitor.Enter? 處,也就表明當前線程在 GetAlarmCount() 方法的一個 lock 處等待。

2. 誰在持有鎖

要想找到誰在持有鎖,需要理解 lock? 的底層機制,它是建立在 AutoResetEvent + ObjectHeader? 基礎之上的一種鎖玩法,在 CLR 層面使用 SyncBlk 的 class 來承載的,參考如下代碼:

class SyncBlock
{
// ObjHeader creates our Mutex and Event
friend class ObjHeader;
friend class SyncBlockCache;
friend struct ThreadQueue;
#ifdef DACCESS_COMPILE
friend class ClrDataAccess;
#endif
friend class CheckAsmOffsets;
protected:
AwareLock m_Monitor; // the actual monitor
SLink m_Link;
DWORD m_dwHashCode;
WCHAR m_BSTRTrailByte;
}

要想觀察這些 SyncBlk? 信息,可以用 WinDbg 提供的快捷命令 !syncblk 來觀察。

0:000:x86> !syncblk
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
180 0b86e8e8 3 1 01452a08 3728 24 039da140 System.Object
-----------------------------
Total 339
CCW 5
RCW 2
ComClassFactory 0
Free 4

從卦中看,當前持有 lock 的線程是 24? 號,那這個線程為什么遲遲不退出鎖呢?這就需要到這個線程棧上找原因了, 使用命令 ~24s; !clrstack 即可。

0:004:x86> ~24s
ntdll_779a0000!NtWaitForMultipleObjects+0xc:
77a11b2c c21400 ret 14h
0:024:x86> !clrstack
OS Thread Id: 0x3728 (24)
Child SP IP Call Site
0e99e504 0000002b [HelperMethodFrame_1OBJ: 0e99e504] System.Threading.WaitHandle.WaitOneNative(System.Runtime.InteropServices.SafeHandle, UInt32, Boolean, Boolean)
0e99e5e8 70bdd952 System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\waithandle.cs @ 243]
0e99e600 70bdd919 System.Threading.WaitHandle.WaitOne(Int32, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\waithandle.cs @ 194]
0e99e614 6e4aa4a8 System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle)
0e99e654 6e8585af System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean)
0e99e658 6e4acc4f [InlinedCallFrame: 0e99e658]
0e99e6e0 6e4acc4f System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[])
...
0e99e83c 0f46512c xxx.AddAlarmQueue(xxx)
...
0e99ea84 0d3f2783 xxx.Func()
0e99ead8 70be2e01 System.Threading.ThreadHelper.ThreadStart_Context(System.Object) [f:\dd\ndp\clr\src\BCL\system\threading\thread.cs @ 74]
...

從卦中看,其中的 MarshaledInvoke 方法很刺眼,它表示工作線程通過 Invoke 向主線程的控件推送數據,因為主線程遲遲沒有響應它,導致它一直在等待,而恰恰它又持有了 lock 鎖,不趕巧主線程因為獲取lock在遲遲等待又無法響應工作線程的 MarshaledInvoke 請求,導致一種死鎖狀態,如果要畫個圖大概是這樣的。

圖片

3. 如何化解

尋得化解之法,需要看下程序中是怎么持有 lock 鎖的,仔細觀察代碼之后,終于找到了 lock 代碼處,截圖如下:

圖片

對代碼敏感得朋友相信一眼就能看出,這 lock 的粒度真tmd的大,只要 lock 中有一處調用了 Invoke,如果不湊巧主線程剛好在等待 lock ,那就死鎖了,正如本篇中的 死鎖。

三:總結

這次卡死事故,本質上來說是程序員對鎖的使用沒有一個好的習慣,沒有遵循鎖的盡早釋放原則。

其實這一塊關系型數據庫做的特別好,鎖的粒度分的很細,諸如:行鎖,RID鎖,Key鎖,頁鎖,表鎖,在必要的時候還會涉及到鎖的升級,將性能,鎖開銷,一致性 做到了極致,非常值得我們研究和學習。

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2024-03-15 15:15:53

.NETCPU系統

2023-09-27 07:23:10

.NET監控軟件

2024-03-28 12:56:36

2024-06-13 17:09:55

2024-07-01 13:00:24

.NET網絡邊緣計算

2024-11-29 10:06:59

2022-01-17 21:28:36

管理系統.NET

2024-07-09 11:51:20

Windows線程池源碼

2023-06-29 17:55:00

.NET日志WinDbg

2025-10-29 01:11:00

.NET系統windows

2023-03-26 20:24:50

ERP網站系統

2024-03-26 00:44:53

.NETCIM系統

2024-08-08 11:21:01

2024-06-04 10:54:34

.NET代碼程序

2021-11-02 07:54:41

內存.NET 系統

2023-06-26 00:12:46

2024-12-27 13:31:18

.NETdump調試

2024-06-06 10:51:15

自動化系統推測

2023-05-15 11:15:50

.NET門診語句

2024-09-14 10:28:56

.NET卡死程序
點贊
收藏

51CTO技術棧公眾號

成人小视频在线观看| 亚洲国产精品91| 日韩片欧美片| 精品国产乱码久久久久久免费| 免费观看国产精品视频| 性欧美欧美巨大69| 久久中国妇女中文字幕| 黄色一级片在线观看| 国产免费观看久久| 亚洲综合网中心| 久久免费大视频| 久久国产色av| 久久影院午夜精品| 欧美性xxxx极品hd欧美风情| 好男人www社区| 美女视频一区在线观看| 成人黄色在线免费| 精品国模一区二区三区欧美| 精品日韩一区二区三区| 欧美一区二区少妇| 亚洲美女屁股眼交3| 青青草视频在线免费播放| 日本中文字幕一区二区视频 | 成人激情在线播放| www.豆豆成人网.com| 精品亚洲永久免费精品| 国产在线观看a视频| 一本久久综合亚洲鲁鲁五月天| ·天天天天操| 国产精品美女久久久久久久久久久 | 成人做爰www免费看视频网站| 亚洲一区二区三区中文字幕在线观看| 日韩成人在线视频网站| 日韩123区| 欧美男女性生活在线直播观看| 色播在线视频| 亚洲三级理论片| 国产美女在线免费观看| 国产精品无遮挡| 亚洲另类第一页| 亚洲视频一二区| 一级特黄视频| 一本色道久久综合亚洲91| 欧美在线观看在线观看| 欧美伊人久久久久久久久影院| 国自产拍在线网站网址视频| 欧洲人成人精品| 中文字幕日本在线| 在线成人午夜影院| 草美女在线观看| 伊人久久综合97精品| 欧美jizz18| 97人洗澡人人免费公开视频碰碰碰| 午夜久久av| 国产精品高精视频免费| 首页国产精品| 蜜桃视频在线观看91| 日韩av中文在线观看| 超碰免费在线公开| av欧美精品.com| www.精品在线| 欧美午夜电影在线| 一二三四区在线观看| 国产亚洲欧美日韩一区二区| 最新国产精品精品视频| 国产精品精品视频| 国产视频一区欧美| 国产免费裸体视频| 国产精品美女久久久久久久久 | 欧美激情在线看| 黄动漫在线免费观看| 欧美自拍偷拍一区| 黄色激情在线播放| 久久久国产精彩视频美女艺术照福利| 6080成人| 99精品国产高清一区二区| 日本女人一区二区三区| 苍井空浴缸大战猛男120分钟| 亚洲综合色成人| 国产原创视频在线观看| 中日韩美女免费视频网站在线观看| www.成人网| 国产美女99p| 不卡av免费在线观看| 国产一级粉嫩xxxx| 日韩欧美资源站| jizz性欧美23| 欧美理论一区二区| 久久午夜电影网| 男女视频在线看| 制服.丝袜.亚洲.中文.综合| 亚洲精品一区av| 69堂成人精品视频免费| 成人精品视频一区二区三区尤物| 欧美视频你懂的| 主播大秀视频在线观看一区二区| 亚洲社区在线观看| 久久精品国产99久久| 伊人情人网综合| 日韩精品免费一区二区三区竹菊 | 特级丰满少妇一级| 色欧美日韩亚洲| 综合日韩av| 91精品久久久久久久久久久| 爽好久久久欧美精品| 亚洲国产欧美日韩| 日韩精品中文字幕一区二区三区 | 91成人短视频| 欧美久久久久中文字幕| av大片在线观看| 狠狠躁夜夜躁人人躁婷婷91 | 天天插综合网| 极品校花啪啪激情久久| 久久久久亚洲| 欧美性大战久久久久xxx| 亚洲精品中文在线影院| 成人免费网站观看| 日韩一级免费观看| 欧美大片网址| 亚洲国产精品女人| 欧美日韩在线视频一区二区| 国产高清亚洲| 日韩伦理一区二区三区av在线| 日韩美女视频一区二区| 成人线上视频| 久久国产精品一区二区三区四区 | 国产理论在线观看| 欧美激情精品久久久久久| 久久久久久9| 另类av导航| 久久久亚洲欧洲日产国码aⅴ| 天堂影院一区二区| 四虎影院在线域名免费观看| 色与欲影视天天看综合网| 麻豆精品一区二区综合av| 在线看中文字幕| 26uuu久久噜噜噜噜| 国产精品综合av一区二区国产馆| 成年人在线观看视频| 日韩美女视频免费在线观看| 国产一本一道久久香蕉| 国产美女福利在线| 亚洲专区中文字幕| 国产精品久久久久精k8| 久久亚洲精品人成综合网| 亚洲成人在线视频网站| 欧美三级电影在线看| 中文字幕一区二区三区乱码图片 | 老司机在线精品视频| 成人黄色av片| 在线看日韩欧美| 激情欧美日韩一区二区| 1234区中文字幕在线观看| 精品久久蜜桃| 欧美日韩亚洲综合| 欧美私人啪啪vps| 激情小说 在线视频| 91中文在线视频| 欧美日韩一区二区精品| 日韩久久久久| 在线视频福利| 91精品天堂| 在线亚洲欧美专区二区| 欧美日韩爆操| 夜级特黄日本大片_在线| 精品国产中文字幕| 日韩免费高清av| 国产一区二区三区四区五区入口| 欧美大片免费高清观看| 欧美 日韩 亚洲 一区| 欧美成人免费观看| 国产欧美日韩激情| 真实原创一区二区影院| 在线免费视频你懂得| 精品一区二区三区自拍图片区 | 色94色欧美sute亚洲线路一ni| 国产精品成人av| 男人天堂资源在线| 精品欧美日韩在线| 精品国精品国产尤物美女| 美女一区二区视频| 牛人盗摄一区二区三区视频| 欧美高清在线| 欧美在线观看在线观看| 欧美凹凸一区二区三区视频| 日韩欧美亚洲一区二区| 国产精品中文欧美| 亚洲不卡在线| 久久久亚洲精华液精华液精华液 | 日韩在线视频网| 中文字幕制服丝袜一区二区三区| 久久99精品久久久久久园产越南| 自拍偷拍第1页| 久久免费视频1| 一二美女精品欧洲| 亚洲黄色录像片| 日韩经典中文字幕一区| 成人污污www网站免费丝瓜| 男人天堂午夜在线| 亚洲一区在线免费|