精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

又一起.NET程序掛死, 用 Windbg 抽絲剝繭式的真實案例分析

開發 前端
為了理解為啥底層會創建那么多線程,我特意還查了下串口類 SerialPort,說串口發送方送過來的數據,接收方可以主動接收,可以被動接收,被動就是這種 事件模式,接收方收到發送方送來的數據時,操作系統會讓 CLR 通過 Thread 來處理這段回調事件,所以從卦象上看就是典型的接收方處理能力不足造成的大量 lock 等待。

 [[394026]]

本文轉載自微信公眾號「一線碼農聊技術」,作者一線碼農聊技術。轉載本文請聯系一線碼農聊技術公眾號。

一:背景

1. 講故事

前天有位粉絲朋友在后臺留言讓我幫忙看看他的 Winform程序 UI無響應 + 410線程 到底是啥情況,如下圖:

說實話,能看到這些真實案例我是特別喜歡的 ,就像醫生看病,光停留在理論和那些 demo 上,那是沒有前途的,如果有朋友在這塊搞不定的話,我可以免費幫你解讀 dump,再附送一篇博客詳述。

好了,言歸正傳,既然粉絲朋友已經提到了高達 410 線程,我本能反應就是要么高負載,要么野線程,后者大多是無數新出現的線程卡在某個鎖上。

WinForm 出現高負載的情況,我至今還是沒遇到??????,如果說卡在某個鎖上,基本都屬于這類,有了這個先入為主的思路,接下來就可以祭出 windbg 一探究竟了。

二:windbg 分析

1. 查找 CLR 同步塊表

十個人用鎖,八個人會用 lock, 所以先用 !syncblk 看看程序的鎖情況。

  1. 0:000> !syncblk 
  2. Index         SyncBlock MonitorHeld Recursion Owning Thread Info          SyncBlock Owner 
  3.    76   070e5fa4           67         1 17367570 15e8 218   03e6dd68 System.IO.Ports.SerialStream 
  4. ----------------------------- 
  5. Total           789 
  6. CCW             39 
  7. RCW             2 
  8. ComClassFactory 1 
  9. Free            535 

我去,從卦象上來看情況很不好,我來簡單分析下。

  • MonitorHeld = 67

這個 67 表示當前有 1 個線程持有鎖,有 33 個線程在等待鎖,肯定有朋友想問怎么算的?很簡單:當一個線程持有了鎖的時候 MonitorHeld+1 ,當一個線程在等待鎖的時候 MonitorHeld+2 ,所以表達式就是: 67= [1 + 66=(33*2)]。

  • Owning Thread Info = 17367570 15e8 218

上面三個信息都表示當前持有線程,可以看最后的 218,它是 windbg 映射出來的線程ID,如果不信的話,可以用 !t 來一探究竟。

  1. 0:000> !t 
  2. ThreadCount:      315 
  3. UnstartedThread:  0 
  4. BackgroundThread: 302 
  5. PendingThread:    0 
  6. DeadThread:       0 
  7. Hosted Runtime:   no 
  8.                                                                          Lock   
  9.        ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception 
  10.    0    1  c64 00cc3de0     24220 Preemptive  042E1884:00000000 00cbc0a0 0     STA  
  11.  214  240 1398 16702b90   1029220 Preemptive  00000000:00000000 00cbc0a0 0     MTA (Threadpool Worker)  
  12.  215  323  b5c 12ab7260   1029220 Preemptive  00000000:00000000 00cbc0a0 0     MTA (Threadpool Worker)  
  13.  216  290 1858 16c21c98   1029220 Preemptive  00000000:00000000 00cbc0a0 0     MTA (Threadpool Worker)  
  14.  218  117 15e8 17367570   1029220 Preemptive  00000000:00000000 00cbc0a0 1     MTA (Threadpool Worker)  
  15.  ... 

對,就是 218 這個罪魁禍首在持有了鎖,導致 33 個線程在無辜的等待它。。。

  • SyncBlock Owner = System.IO.Ports.SerialStream

也許你會好奇,到底 lock 持有的是哪一個對象呢?從 SyncBlock Owner 上看就是 SerialStream, ????,原來老兄在玩串口編碼,我先膜拜一下。

2. 查看線程棧

知道是 218 惹的禍,接下來可以看看它的線程棧,到底都在干什么?

關于上面的調用棧,可能有些朋友看不明白,我畫了一張簡圖:

從圖中看,來自于 ThreadPool 的線程在用戶自定義的 DataReceived 方法上卡住了,為了方便我就用 !DumpIL 看看這個方法的 IL 代碼。

  1. 0:218> !name2ee *!xxx.TYAComYB.DataReceived 
  2. Module:      03b10cc4 
  3. Assembly:    YKit.dll 
  4. Token:       06000108 
  5. MethodDesc:  08533584 
  6. Name:        xxx.TYAComYB.DataReceived(System.Object, System.IO.Ports.SerialDataReceivedEventArgs) 
  7. JITTED Code Address: 08644dc0 
  8.  
  9. 0:218> !dumpil 08533584 
  10. ilAddr = 05dc2dd8 
  11. IL_0000: nop  
  12. IL_0001: nop  
  13. IL_0002: nop  
  14. IL_0003: ret  

這代碼居然藏了鉤子,用 !dumpil 居然看不到代碼,難怪在線程棧上看到了類似混淆的方法:xxx.TYAComYB.EYLlXL2bKH(),不過看反匯編是沒有問題的,簡化如下:

  1. 0:218> !U /d 08644edf 
  2. 08644ddd e86edaffff      call    08642850 (xxxx.com.ComPort.get_isOpen(), mdToken: 060004b6) 
  3. 08644df4 e807deffff      call    08642c00 (xxxx.YBComParam.get_DataPacketLen(), mdToken: 0600010c) 
  4. 08644dfb b92a3e136e      mov     ecx,offset mscorlib_ni!System.GC.ReRegisterForFinalize(System.Object) <PERF> (mscorlib_ni+0x3e2a) (6e133e2a) 
  5. 08644e00 e80fd460f8      call    00c52214 (JitHelp: CORINFO_HELP_NEWARR_1_VC) 
  6. 08644e15 e8e6ddffff      call    08642c00 (xxx.YBComParam.get_DataPacketLen(), mdToken: 0600010c) 
  7. 08644e22 e8edac4d68      call    System_ni+0x13fb14 (70b1fb14) (System.IO.Ports.SerialPort.Read(Byte[], Int32, Int32), mdToken: 06004173) 
  8. 08644e2e ff153836b103    call    dword ptr ds:[3B13638h] (xxxx.LogKit.WriteLine(System.Exception), mdToken: 06000183) 
  9. 08644e59 e8a2ddffff      call    08642c00 (xxxx.YBComParam.get_DataPacketLen(), mdToken: 0600010c) 
  10. 08644e64 ff1580355308    call    dword ptr ds:[8533580h] (xxxx.TYAComYB.EYLlXL2bKH(), mdToken: 06000107) 
  11. 08644e9b ff15a4265308    call    dword ptr ds:[85326A4h] (xxxx.YBComParam.get_DataPacketStart(), mdToken: 0600010e) 
  12. 08644ea8 e837e34e66      call    mscorlib_ni!System.Convert.ToByte(System.String, Int32) (6eb331e4) 
  13. 08644ed9 ff1580355308    call    dword ptr ds:[8533580h] (xxxx.TYAComYB.EYLlXL2bKH(), mdToken: 06000107) 

反正做的事情挺多,我就懶得分析了。

接下來看看那 33 個線程怎么就卡在 SerialStream 上呢?可以用 ~*e !clrstack 掃一下所有的 threads,抽幾個看看。

  1. 0:218> ~*e !clrstack 
  2. OS Thread Id: 0xc64 (0) 
  3. Child SP       IP Call Site 
  4. OS Thread Id: 0x13d8 (330) 
  5. Child SP       IP Call Site 
  6. 1b1aec90 77c8016d [GCFrame: 1b1aec90]  
  7. 1b1aee30 77c8016d [GCFrame: 1b1aee30]  
  8. 1b1aede0 77c8016d [HelperMethodFrame: 1b1aede0] System.Threading.Monitor.ReliableEnter(System.Object, Boolean ByRef) 
  9. 1b1aee70 710d6b54 System.IO.Ports.SerialPort.CatchReceivedEvents(System.Object, System.IO.Ports.SerialDataReceivedEventArgs) 
  10. 1b1aeeac 710d9520 System.IO.Ports.SerialStream+EventLoopRunner.CallReceiveEvents(System.Object) 
  11. 1b1aeec0 6e45e356 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object) 
  12. 1b1aeec8 6e43da07 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
  13. 1b1aef34 6e43d956 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
  14. 1b1aef48 6e45f120 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
  15. 1b1aef5c 6e45e929 System.Threading.ThreadPoolWorkQueue.Dispatch() 
  16. 1b1aefac 6e45e7d5 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() 
  17. 1b1af1d4 71382552 [DebuggerU2MCatchHandlerFrame: 1b1af1d4]  

我去,居然都卡在 System.IO.Ports.SerialPort.CatchReceivedEvents 這里了,而且還是 framework 提供的,這就很困惑了。

3. 分析 SerialPort 源碼

要想看 SerialPort 類的源碼,可以用 ILSpy,如下圖所示:

看到這里,再結合我剛才畫的圖,思路是不是就清晰多了,究其原因就是 dataReceived(this, e); 觸發的用戶回調函數遲遲得不到結束,導致底層大量的線程在 lock 處等待。

三:總結

為了理解為啥底層會創建那么多線程,我特意還查了下串口類 SerialPort,說串口發送方送過來的數據,接收方可以主動接收,可以被動接收,被動就是這種 事件模式,接收方收到發送方送來的數據時,操作系統會讓 CLR 通過 Thread 來處理這段回調事件,所以從卦象上看就是典型的接收方處理能力不足造成的大量 lock 等待。

大概提兩點優化措施:

  • 提升 xxx.TYAComYB.DataReceived 方法中業務邏輯的處理能力。
  • 增加蓄水池,讓底層的 lock (serialStream) 盡快得到釋放。

 

 

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

2015-06-09 11:13:18

2021-06-16 07:56:21

Redis分布式

2021-06-11 18:27:10

LinuxLinux內核

2022-07-11 11:28:45

數據分析業務消費

2024-04-01 00:07:20

LinuxeBPF源碼

2022-07-05 21:31:21

索引SQL分庫分表

2022-01-17 17:55:29

Python變量交換開發

2020-05-06 08:01:39

黑客惡意攻擊網絡安全

2024-01-03 16:39:07

2025-05-12 08:27:25

2017-09-15 09:18:27

JavaSQLDBA

2022-04-01 15:18:42

Web 框架網絡通信

2018-09-13 15:21:36

CTO訓練營

2020-06-11 16:15:25

Java線程池代碼

2012-12-17 10:14:47

Wi-Fiwifi無線網絡

2023-06-27 13:47:00

分布式事務本地事務

2020-02-26 08:00:20

惡意刪庫拘留

2024-11-15 16:52:23

C#棧邊界?;?/a>

2015-12-28 16:09:20

物聯網市場

2025-06-18 08:00:56

點贊
收藏

51CTO技術棧公眾號

日韩一级av毛片| 麻豆av免费在线| 亚洲欧美高清视频| 裸体素人女欧美日韩| 中文字幕亚洲综合| 成人做爰69片免费| 91看片一区| 亚洲香肠在线观看| 色狠狠久久av五月综合| 亚洲黄色a级片| 欧美aaa在线| 久久久久久久久久久久久久久久久久av | 日韩一级在线观看| 日韩精品一区中文字幕| aaa大片在线观看| 久久久久久99精品| 国产精品av一区| 一区二区三区免费在线| 国产一区二区高清| 欧美极品少妇xxxxⅹ裸体艺术| 国产精品成人无码免费| 久久资源综合| 欧美大片一区二区三区| 黄色一级片免费的| 日本一道高清亚洲日美韩| 亚洲第一成年网| 国产成人生活片| 米奇精品一区二区三区| 国产人成一区二区三区影院| 国产伦精品一区二区三区高清| 国产精品毛片一区视频播| 青青草国产精品亚洲专区无| 97视频网站入口| 国产一级二级三级| 欧美日韩1区2区3区| 日韩在线免费视频观看| 黄大色黄女片18免费| 亚洲精品3区| 日韩第一页在线| 五月天丁香社区| 99久久香蕉| 日韩精品中文字幕一区二区三区| 一起操在线视频| 欧美成人毛片| 欧美性感一区二区三区| 亚洲一二三区av| 成人在线视频观看| 欧美日韩一区二区三区高清| 少妇人妻互换不带套| 另类图片综合电影| 欧美午夜不卡视频| 色综合色综合色综合色综合| 91p九色成人| 欧美日韩在线播放三区| 第四色婷婷基地| 伊人久久综合网另类网站| 欧美精品第一页| 黄色三级视频在线播放| 欧美久久亚洲| 亚洲成人精品久久久| 欧美一级片黄色| 日日天天久久| 亚洲天堂网站在线观看视频| 一级黄色录像毛片| 国产精品99视频| 欧美成人久久久| 国产在线拍揄自揄拍| 亚洲美女91| 欧美专区国产专区| 中文字幕第315页| 国产在线精品不卡| 国产精品自拍首页| 国产在线视频网址| 亚洲美女淫视频| av在线播放天堂| 成年美女黄网站色大片不卡| 在线观看网站黄不卡| 国模私拍视频在线观看| 777久久精品| 国产午夜精品麻豆| 午夜国产福利视频| 在线欧美不卡| 国产成人免费av| 国内精品国产成人国产三级| 成人精品小蝌蚪| 日韩av高清| aa在线视频| 岛国精品视频在线播放| 黄大色黄女片18第一次| 一区二区三区国产好| 亚洲精品电影网| 99国产精品免费| 影音先锋久久| 国产精品久久视频| 成人久久久精品国产乱码一区二区| 成人18视频在线播放| 欧美专区一二三| 在线观看wwwxxxx| 日本高清无吗v一区| 下面一进一出好爽视频| 免费久久精品| 欧美国产日韩视频| 人妻中文字幕一区二区三区| 国产精品99久久久久久久vr| 久久综合伊人77777麻豆| 成人ww免费完整版在线观看| 欧美日韩中文在线| 俄罗斯女人裸体性做爰| 狠狠色狠狠色综合婷婷tag| 欧美成人免费在线观看| 成年人晚上看的视频| 成人手机在线视频| 伊人久久大香线蕉精品 | 日韩av色综合| www.97av| 中文字幕五月欧美| 亚洲中文字幕久久精品无码喷水| 中文字幕一区图| 中文字幕在线成人| 无码人妻熟妇av又粗又大| 成人国产精品免费观看| 国产高清不卡无码视频| 国产精品videossex撒尿| 日韩国产激情在线| 日韩成人免费在线观看| 国产成人在线视频网站| 日韩第一页在线观看| 国模私拍国内精品国内av| 国产偷国产偷亚洲清高网站| 天天操天天干视频| 成人av在线影院| 久操网在线观看| 深夜福利一区| 久久综合网hezyo| 国产伦一区二区| 18成人在线观看| 91在线第一页| 久久久国产精品| 成人做爰www免费看视频网站| 国产乱子伦三级在线播放| 欧美午夜激情视频| 亚洲av网址在线| 99视频一区| 久99久视频| 国产在线观看www| 亚洲国产精品专区久久| 五月婷婷开心网| 久久婷婷色综合| 激情五月亚洲色图| blacked蜜桃精品一区| 国产精品激情av电影在线观看 | 中文字幕欧美三区| 手机视频在线观看| 手机在线电影一区| 成人福利免费观看| 黄色网址免费在线观看| 欧美精品在线观看播放| 免费看一级大片| 国产精品一区二区男女羞羞无遮挡| 欧洲美女和动交zoz0z| 国产精品美女久久久久| 欧美成人黄色小视频| 超碰在线人人干| 天天综合色天天综合| 亚洲久久久久久| 老司机免费视频久久 | 激情综合网址| 精品国产乱码久久久久久丨区2区| 国产盗摄——sm在线视频| 日韩精品视频中文在线观看| 99久久久久久久久| 国产精品福利一区二区| avtt中文字幕| 国产精品主播| 中文字幕欧美人与畜| 91综合久久爱com| 欧美又大粗又爽又黄大片视频| 男人久久精品| 欧美一区二区三区四区高清| 日韩av在线电影| 中文幕一区二区三区久久蜜桃| 九九九九九九九九| 亚洲区欧美区| 亚洲精品视频一二三| 日韩精品视频中文字幕| 日本精品免费观看| 97超碰资源站在线观看| 亚洲免费精彩视频| 国产口爆吞精一区二区| 图片区小说区国产精品视频| 欧美18—19性高清hd4k| 激情综合网天天干| 99爱视频在线| 亚洲一区在线| 日韩福利二区| 国产色噜噜噜91在线精品 | 又色又爽又黄无遮挡的免费视频| 亚洲一区二区综合| 99热6这里只有精品| 99久久精品国产麻豆演员表| 亚洲 激情 在线| 亚洲影视综合| 日本免费成人网| 欧美国产一区二区三区激情无套| 精品视频一区二区| 日韩免费一级| 国产精品网站视频| 性xxxxfreexxxxx欧美丶| 欧美另类高清videos| 黄色视屏网站在线免费观看| 精品对白一区国产伦| 国产精品久久久久久免费播放| 色婷婷久久一区二区三区麻豆| 黄色一级片在线| 亚洲天堂网中文字| 九九九视频在线观看| 91免费看视频| 蜜臀视频在线观看| 国产精品综合一区二区三区| 亚洲欧美久久久久| 日韩国产高清影视| 中文字幕日本最新乱码视频| 午夜日韩激情| 97超碰免费观看| 久久精品国产亚洲夜色av网站| 欧美黑人3p| 色综合久久中文| 国产日韩欧美综合精品| 日韩精品一区二区三区中文在线| 国产精品自拍网| av成人在线观看| 国产精品福利网| 免费观看一级欧美片| 91精品国产91久久| 碰碰在线视频| 欧美在线一级视频| 超级碰碰久久| 国产91在线高潮白浆在线观看| 在线日韩影院| 欧日韩不卡在线视频| 午夜激情在线播放| 欧美尤物巨大精品爽| 成年美女黄网站色大片不卡| 秋霞成人午夜鲁丝一区二区三区| 伊人色综合一区二区三区影院视频| 91精品国产91久久| 色8久久影院午夜场| 日本精品久久久久影院| 影视一区二区三区| 国产精品高潮呻吟久久av黑人| www.国产精品| 成人久久一区二区三区| 日本一区二区三区视频在线看 | 岛国毛片在线播放| 韩国毛片一区二区三区| 午夜xxxxx| www.日韩精品| 级毛片内射视频| 国产精品久久精品日日| 私库av在线播放| 精品人伦一区二区三区蜜桃网站 | 国产无套在线观看| 精品国产精品三级精品av网址| 国产免费av一区| 欧美少妇xxx| 性一交一乱一精一晶| 亚洲精品国精品久久99热一| 国产理论电影在线观看| 日韩视频免费在线| 激情av在线播放| 国产成人免费av电影| gogo大尺度成人免费视频| 国产成人精品免费视频大全最热| 亚洲精品国产setv| 一本一生久久a久久精品综合蜜| 中文在线日韩| 青青视频在线播放| 老色鬼精品视频在线观看播放| 日本中文字幕在线不卡| 91影院在线观看| 成人无码精品1区2区3区免费看| 亚洲国产中文字幕在线视频综合| 久久99国产综合精品免费| 欧美日本视频在线| 日本久久一级片| 日韩在线视频中文字幕| 黄在线观看免费网站ktv| 国产精品专区h在线观看| 成人高潮视频| 一区二区三区四区五区精品 | 欧洲成人免费aa| 免费一级欧美在线观看视频| http;//www.99re视频| 女人av一区| 菠萝蜜视频在线观看入口| 久久字幕精品一区| 99免费观看视频| 国产精品色呦呦| 在线天堂中文字幕| 91精品国产欧美一区二区成人 | 国产午夜精品一区二区三区视频| 九九精品在线观看视频| 欧美系列亚洲系列| 亚洲日本国产精品| 色综合久久88| 亚洲资源在线| 日韩欧美一区二区视频在线播放 | 欧美一区第一页| 日韩精品一级| 一区二区三区精品国产| 免费中文字幕日韩欧美| 91九色蝌蚪porny| 亚洲欧美视频在线观看视频| 69av视频在线观看| 日韩成人在线视频| www欧美xxxx| www.成人av.com| 婷婷综合网站| 少妇一级淫免费放| 国产喂奶挤奶一区二区三区| 日韩毛片在线播放| 精品日韩一区二区三区免费视频| 免费在线你懂的| 国产精品中文久久久久久久| 国产一区网站| 国产黄色特级片| www久久精品| 久草国产精品视频| 亚洲第五色综合网| 丁香花在线高清完整版视频| 96成人在线视频| 国产在线欧美| 亚洲少妇一区二区| 亚洲精选视频在线| 国产精品无码白浆高潮| yellow中文字幕久久| 成人在线免费av| 这里只有精品66| 狠狠色丁香久久婷婷综| 国内毛片毛片毛片毛片毛片| 欧美日韩黄视频| 国产在线高清视频| 91亚洲永久免费精品| 小小影院久久| 亚洲制服在线观看| 亚洲激情在线播放| 黄色一级a毛片| 69久久夜色精品国产69| 亚洲免费专区| 日本美女高潮视频| 国产精品久久久久久亚洲伦| 在线免费看av片| 日韩视频第一页| 国产精品久久久久av蜜臀| 国产精品12345| 国产日韩欧美高清| 一本一道人人妻人人妻αv| 欧美xxxx做受欧美.88| 一区二区视频| 免费在线激情视频| 国产日产欧美精品一区二区三区| 中文资源在线播放| 久久手机精品视频| 国产精品2023| 成人毛片视频网站| 国产欧美日韩一区二区三区在线观看| 中文字幕永久在线观看| 久久综合久久美利坚合众国| 亚洲一区二区三区四区电影| 成人黄色av片| 欧美激情在线免费观看| 国产不卡av在线播放| 91精品国产777在线观看| 不卡在线一区| 又色又爽又黄18网站| 一本一本久久a久久精品综合麻豆| 日本最新在线视频| 国产精品久久久久久久小唯西川| 麻豆久久婷婷| 欧美精品久久久久性色| 亚洲精品日韩久久久| 成人短视频软件网站大全app| 国产日韩av网站| 中文字幕+乱码+中文字幕一区| 国产av无码专区亚洲a∨毛片| 57pao国产精品一区| 欧美1级片网站| 国产伦精品一区三区精东| 在线视频一区二区免费| 亚洲夜夜综合| 日韩电影免费观看在| 大桥未久av一区二区三区中文| 欧美一级淫片免费视频黄| 免费av一区二区| 免费成人av| 亚洲成av人片在线观看无| 精品视频全国免费看| 欧美私密网站| 91成人综合网| 专区另类欧美日韩|