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

記一次 .NET某上位機視覺程序卡死分析

開發 前端
看到源碼之后太無語了,其實就是一個簡單的 顏色賦值?,根據前面的探索styleManager1是由渲染線程創建的,所以主線程對它的賦值自然是得不到渲染線程的反饋。

一、背景

1. 講故事

前段時間有位朋友找到我,說他的窗體程序在客戶這邊出現了卡死,讓我幫忙看下怎么回事?dump也生成了,既然有dump了那就上 windbg 分析吧。

二、WinDbg 分析

1. 為什么會卡死

窗體程序的卡死,入口門檻很低,后續往下分析就不一定了,不管怎么說先用 !clrstack 看下主線程,輸出如下:

0:000> !clrstack
OS Thread Id: 0x3118 (0)
        Child SP               IP Call Site
000000c478afd1d8 00007ffc284e9a84 [HelperMethodFrame_1OBJ: 000000c478afd1d8] System.Threading.WaitHandle.WaitOneNative(System.Runtime.InteropServices.SafeHandle, UInt32, Boolean, Boolean)
000000c478afd300 00007ffbf2cc19ac System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\waithandle.cs @ 243]
000000c478afd330 00007ffbf2cc197f System.Threading.WaitHandle.WaitOne(Int32, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\waithandle.cs @ 194]
000000c478afd370 00007ffbf1421904 System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle)
000000c478afd3e0 00007ffbf0c8e2f4 System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean)
000000c478afd520 00007ffbf1425124 System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[])
000000c478afd590 00007ffb995d6fe8 DevComponents.DotNetBar.StyleManager.OnColorTintChanged(System.Drawing.Color, System.Drawing.Color)
000000c478afd5f0 00007ffb995d69ff DevComponents.DotNetBar.StyleManager.set_ColorTint(System.Drawing.Color)
000000c478afd680 00007ffb995d694c DevComponents.DotNetBar.StyleManager.set_ManagerColorTint(System.Drawing.Color)
...
000000c478afd6b0 00007ffb995d50f9 xxx.MarkInspectPadControl.InitializeComponent()

有經驗的朋友看到上面的卦象相信就知道咋事情了,即有工作線程創建了用戶控件導致的,而且這個控件貌似和 DevComponents 有關,接下來的常規套路就是挖一下 WindowsFormsSynchronizationContext 對象看看到底是哪一個線程創建的,使用 !dso 即可。

0:000> !dso
OS Thread Id: 0x3118 (0)
RSP/REG          Object           Name
000000C478AFCF98 000002093b9143c0 System.Windows.Forms.WindowsFormsSynchronizationContext
...
0:000> !do poi(20939c91588)
Name:        System.Threading.Thread
MethodTable: 00007ffbf2769580
EEClass:     00007ffbf288c658
Size:        96(0x60) bytes
00007ffbf276aaf8  4001934       4c         System.Int32  1 instance                1 m_ManagedThreadId

按照劇本的話 WindowsFormsSynchronizationContext 應該會有2個,但這里只有1個,這一個還是主線程的同步上下文,這就完犢子了。。。完全不按照劇本走,這也是真實dump分析的復雜性,那到底是誰創建的呢?天要絕人之路嗎?

2. 出路在哪里

所有東西的落地都在匯編里,而匯編又在方法里,所以突破口就是尋找線程棧中的方法,接下來到 System.Windows.Forms.Control.MarshaledInvoke 方法里看一看可有什么大貨,簡化后如下:

private object MarshaledInvoke(Control caller, Delegate method, object[] args, bool synchronous)
{
    bool flag = false;
    if (SafeNativeMethods.GetWindowThreadProcessId(new HandleRef(this, Handle), out var _) == SafeNativeMethods.GetCurrentThreadId() && synchronous)
    {
        flag = true;
    }
    ThreadMethodEntry threadMethodEntry = new ThreadMethodEntry(caller, this, method, args, synchronous, executionContext);
    lock (threadCallbackList)
    {
        if (threadCallbackMessage == 0)
        {
            threadCallbackMessage = SafeNativeMethods.RegisterWindowMessage(Application.WindowMessagesVersion + "_ThreadCallbackMessage");
        }
        threadCallbackList.Enqueue(threadMethodEntry);
    }
    if (flag)
    {
        InvokeMarshaledCallbacks();
    }
    else
    {
        UnsafeNativeMethods.PostMessage(new HandleRef(this, Handle), threadCallbackMessage, IntPtr.Zero, IntPtr.Zero);
    }
    if (synchronous)
    {
        if (!threadMethodEntry.IsCompleted)
        {
            WaitForWaitHandle(threadMethodEntry.AsyncWaitHandle);
        }
        return threadMethodEntry.retVal;
    }
    return threadMethodEntry;
}

從卦中的代碼來看,這個 SafeNativeMethods.GetWindowThreadProcessId 方法是關鍵,它可以拿到這個窗口創建的processid和threadid,接下來觀察下簡化后的匯編代碼。

0:000> !U /d 00007ffbf0c8e2f4
preJIT generated code
System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean)
Begin 00007ffbf0c8dec0, size 4e9
00007ffb`f0c8dec0 55              push    rbp
00007ffb`f0c8dec1 4157            push    r15
00007ffb`f0c8dec3 4156            push    r14
00007ffb`f0c8dec5 4155            push    r13
00007ffb`f0c8dec7 4154            push    r12
00007ffb`f0c8dec9 57              push    rdi
00007ffb`f0c8deca 56              push    rsi
00007ffb`f0c8decb 53              push    rbx
00007ffb`f0c8decc 4881ecf8000000  sub     rsp,0F8h
00007ffb`f0c8ded3 488dac2430010000 lea     rbp,[rsp+130h]
...
00007ffb`f0c8dff0 488d55b0        lea     rdx,[rbp-50h]
00007ffb`f0c8dff4 ff151e1eddff    call    qword ptr [System_Windows_Forms_ni+0x8fe18 (00007ffb`f0a5fe18)] (System.Windows.Forms.SafeNativeMethods.GetWindowThreadProcessId(System.Runtime.InteropServices.HandleRef, Int32 ByRef), mdToken: 00000000060033c4)
00007ffb`f0c8dffa 448bf0          mov     r14d,eax

根據卦中的匯編以及x64調用協定,lea rdx,[rbp-50h] 就是我們的 processid,同時 mov r14d,eax 中的 r14d 就是我們的 threadid,突破口已找到,接下來就是深挖了。

3. 如何挖出進程ID和線程ID

有一點要知道 000000c478afd520 和 MarshaledInvoke 方法的 rsp 隔了一個 0x8,同時方法中影響 rsp 的 push 和 sub 都要計算進去,這里就不贅述了,具體可以參考文章:https://www.cnblogs.com/huangxincheng/p/17250240.html 簡單計算后如下:

0:000> ? 000000c478afd520-0x8-(0n8*0n8)-0xF8+0x130
Evaluate expression: 843838379280 = 000000c4`78afd510
0:000> dp 000000c4`78afd510-0x50 L1
000000c4`78afd4c0  00000000`000029dc

0:000> r r14
r14=000000c478afcf14
0:000> dp 000000c478afcf14 L1
000000c4`78afcf14  00000000`00000080

從卦中可以看到 processid=29dc ,threadid=0x80,這東西是何方神圣呢,我們用 ~ 來找它的真身吧。

0:000> ~
...
  18  Id: 29dc.80 Suspend: 0 Teb: 000000c4`7890d000 Unfrozen
...

0:018> k
 # Child-SP          RetAddr               Call Site
00 000000c4`7a2ffcc8 00007ffc`28028ba3     ntdll!NtWaitForSingleObject+0x14
01 000000c4`7a2ffcd0 00007ffb`fa651cf8     KERNELBASE!WaitForSingleObjectEx+0x93
02 000000c4`7a2ffd70 00007ffb`fa652a51     wpfgfx_v0400!CPartitionManager::GetWork+0x17b
03 000000c4`7a2ffdc0 00007ffb`fa67a2fb     wpfgfx_v0400!CPartitionThread::Run+0x21
04 000000c4`7a2ffdf0 00007ffc`2a037bd4     wpfgfx_v0400!CPartitionThread::ThreadMain+0x2b
05 000000c4`7a2ffe20 00007ffc`2a76ced1     kernel32!BaseThreadInitThunk+0x14
06 000000c4`7a2ffe50 00000000`00000000     ntdll!RtlUserThreadStart+0x21

現在有點傻傻分不清了,怎么 winform 里還有 wpf 的渲染線程,有可能是 DevComponents 這種第三方控件在底層引入的吧。到這里路子又被堵死了,接下來該往哪里走呢?三步一回頭,繼續看主線程上的方法代碼吧。

4. 在源碼中尋找答案

雖然在兩條路上的突圍都失敗了,但可以明顯的看到離真相真的越來越近,也收獲到了大量的作戰信息,通過上面的 set_ManagerColorTint 方法的反編譯,參考如下:

private void InitializeComponent()
{
    this.styleManager1.ManagerColorTint = System.Drawing.Color.Black;
}

[Description("Indicates color current style is tinted with.")]
[Category("Appearance")]
public Color ManagerColorTint
{
    get
    {
        return ColorTint;
    }
    set
    {
        ColorTint = value;
    }
}

看到源碼之后太無語了,其實就是一個簡單的 顏色賦值,根據前面的探索styleManager1是由渲染線程創建的,所以主線程對它的賦值自然是得不到渲染線程的反饋。

那這個問題該怎么辦呢?大概是如下兩種吧。

  1. 重點關注 styleManager1 控件,用排除法觀察程序運行狀況。
  2. 看文檔是否用了錯誤的方式使用 styleManager1 控件。

三:總結

這次生產事故還是挺有意思的,為什么 WinForm 中可以存在 CPartitionThread 渲染線程,最后還禍在其身,給我幾百例dump分析之旅中添加了一筆色彩!

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

2024-07-12 11:20:34

.NET崩潰視覺程序

2024-06-06 10:51:15

自動化系統推測

2024-12-27 13:31:18

.NETdump調試

2024-05-28 10:18:30

WPF程序數據

2024-05-20 09:39:02

.NETurl線程池

2023-09-27 07:23:10

.NET監控軟件

2022-10-13 18:40:05

.NETOA后端

2024-07-01 13:00:24

.NET網絡邊緣計算

2022-01-17 21:28:36

管理系統.NET

2024-11-29 10:06:59

2023-05-15 11:15:50

.NET門診語句

2025-09-02 01:35:00

.NET光學定位軟件

2022-10-09 10:47:37

NET視覺軟件

2022-10-25 14:17:01

.NET代碼程序

2023-06-26 00:12:46

2024-03-28 12:56:36

2023-04-06 10:52:18

2023-07-06 10:11:38

.NET模式dump

2024-03-26 00:44:53

.NETCIM系統

2023-03-26 20:24:50

ERP網站系統
點贊
收藏

51CTO技術棧公眾號

久久午夜激情| 无码少妇一区二区三区| 亚洲欧洲制服丝袜| 国产精品一区二| 亚洲成熟少妇视频在线观看| 99视频精品全部免费在线视频| 日韩视频一区二区在线观看| 国产三区在线视频| 黄色在线论坛| 91小视频在线观看| 91精品国产综合久久香蕉的用户体验| 久久精品国产亚洲AV无码男同| 国产伦精品一区二区三区千人斩| 日韩一卡二卡三卡四卡| 韩国中文字幕av| 麻豆av在线播放| 亚洲国产精品传媒在线观看| 国产呦系列欧美呦日韩呦| 一级黄色大片网站| 国产午夜久久| 九九久久久久久久久激情| 欧美另类z0zx974| 久久婷婷国产| 日韩欧美精品在线视频| 久久99爱视频| 国产成人精品亚洲日本在线观看| 亚洲精品乱码久久久久| 亚洲一区三区| 国产一区二区影视| 99久久精品费精品国产一区二区| 成人在线小视频| 日韩欧美国产另类| 亚洲中午字幕| 2020欧美日韩在线视频| 精品一区二区三区人妻| 51精产品一区一区三区| 色悠悠久久久久| jizz18女人高潮| 国产日产一区| 国产午夜精品理论片a级探花| 337p日本欧洲亚洲大胆张筱雨| 成人午夜毛片| 欧洲亚洲精品在线| 欧美视频第一区| 波多野结衣亚洲| 欧美日韩精品国产| 国产免费黄色小视频| 日本乱理伦在线| 亚洲精品亚洲人成人网在线播放| 26uuu成人| 国产精品剧情一区二区在线观看 | 亚洲a成v人在线观看| 影音先锋国产在线| 三级欧美韩日大片在线看| 欧洲s码亚洲m码精品一区| 国产精品免费av一区二区| 在线播放亚洲| 2020欧美日韩在线视频| 你懂的国产在线| 久久国产精品久久w女人spa| 日本国产精品视频| 波多野结衣视频免费观看| 日韩激情视频网站| 国产精品视频资源| 91在线公开视频| 国产精品一区二区不卡| 成人av资源网| 亚洲 国产 欧美 日韩| 2023国产精品视频| 色阁综合av| 黄网站免费在线播放| 一区二区在线观看免费| 免费拍拍拍网站| 亚洲精品一区| 精品视频在线看| 亚洲一区二区三区四区精品| 亚洲精品观看| 日韩av在线不卡| 欧美激情亚洲色图| 亚洲五月综合| 69视频在线播放| 中文字幕精品一区二区精| 国内精品免费**视频| 国产精品国产精品国产专区蜜臀ah| 日本精品久久久久| 久久先锋影音av| 最新精品视频| 国产伦子伦对白在线播放观看| 色欧美日韩亚洲| 17c国产在线| 欧美午夜寂寞| www.亚洲人.com| 日韩欧美大片在线观看| 蜜臀av一区二区| av一本久道久久波多野结衣| 每日更新av在线播放| 亚洲婷婷在线视频| 苍井空浴缸大战猛男120分钟| 国产亚洲精品精品国产亚洲综合| 精品国产乱码久久久久久老虎| 日本少妇高潮喷水xxxxxxx| 久久久久美女| 日韩美女av在线免费观看| 国产三级在线观看视频| 久久―日本道色综合久久| 亚洲国产精品女人| 精品国产免费人成网站| 精品免费一区二区三区| 一级在线观看视频| 亚洲麻豆一区| 亚洲精品日韩av| 高清毛片在线看| 亚洲福利视频导航| www.五月天色| 欧美少妇xxxx| 1769国产精品| 亚洲精品久久久久久动漫器材一区| 久久久精品蜜桃| 分分操这里只有精品| 白嫩亚洲一区二区三区| 在线观看日韩av| 亚洲第一在线播放| 国产成a人无v码亚洲福利| 亚洲免费在线精品一区| 日韩影片中文字幕| 日韩成人在线电影网| 欧美国产日韩在线观看成人| 蜜桃av噜噜一区| 欧洲精品久久| 亚洲性受xxx喷奶水| 亚洲精品一区二区三区在线观看| 特一级黄色录像| 美女网站色91| 视频在线观看成人| 欧美黑人疯狂性受xxxxx野外| 亚洲福利在线观看| 久草国产在线视频| 国产精品正在播放| 老司机av福利| 日韩成人综合网| 色哟哟网站入口亚洲精品| 最新中文字幕在线观看视频| 久久久久久免费网| aa在线免费观看| 青青久久av| 7777免费精品视频| 天堂av网在线| 色综合天天综合网天天狠天天| 影音先锋人妻啪啪av资源网站| 亚洲人成免费| 精品免费视频123区| 国产一二三在线| 精品亚洲一区二区三区四区五区| 在线观看免费国产视频| 91影院在线免费观看| 欧美精品一区免费| 伊人成综合网伊人222| 日韩av免费看网站| 第一福利在线| 欧美丰满少妇xxxxx高潮对白| 日本不卡一二区| 国产精品888| 久久综合久久久久| 亚洲欧美日本伦理| 国产aⅴ夜夜欢一区二区三区| 电影av一区| 欧美一二区视频| 日韩黄色a级片| 久久综合给合久久狠狠狠97色69| 久久久国产欧美| 91精品国产乱码久久久久久久| 91大片在线观看| 久久男人av资源站| 国产亚洲福利一区| 国产绿帽一区二区三区| 亚洲第一综合色| 能免费看av的网站| 激情久久五月天| 亚洲精品蜜桃久久久久久| 偷拍一区二区| 国产欧美日韩精品丝袜高跟鞋| 操你啦在线视频| 亚洲经典中文字幕| 这里只有精品国产| 亚洲综合精品久久| 亚洲熟妇无码av| 激情五月激情综合网| 青青草精品视频在线| 精品国产99| 99久久精品久久久久久ai换脸| 国产精品论坛| 久久精品国产v日韩v亚洲| 五月婷婷伊人网| 717成人午夜免费福利电影| 国产精品二区一区二区aⅴ| 国产视频一区在线观看| 性一交一黄一片| 日韩综合小视频| 国产一级做a爰片久久毛片男| 久久91麻豆精品一区| 91久久精品国产91久久性色| 中文不卡1区2区3区| 蜜臀久久99精品久久久无需会员| 亚洲人午夜射精精品日韩| 欧美二区在线观看| av手机天堂网| 五月天国产精品| 裸体武打性艳史| 久久精品视频在线看| 逼特逼视频在线观看| 久久99久久99小草精品免视看| 免费看一级大黄情大片| 欧美成人高清| 亚洲自拍三区| 亚洲+变态+欧美+另类+精品| 91在线观看免费| 久久不卡日韩美女| 日本精品视频在线| а√天堂资源官网在线资源| 欧美剧在线观看| 欧美激情二区| 色综合伊人色综合网| 女人天堂在线| 亚洲精品国产精品久久清纯直播| 精品人妻一区二区三区含羞草| 欧美日本一区二区在线观看| 免费无码国产精品| 精品欧美一区二区三区| 精品无码人妻一区二区三| 椎名由奈av一区二区三区| 国产又粗又黄又猛| 国产亚洲精品超碰| 中文字幕av网址| 99久久婷婷国产综合精品电影| 亚洲妇女无套内射精| 久久精品99久久久| 天堂一区在线观看| 日韩av中文字幕一区二区三区| 黄在线观看网站| 一区二区三区精品视频在线观看| 97在线国产视频| 日韩天天综合| 你懂的av在线| 久久精品人人| 韩国日本美国免费毛片| 天堂精品中文字幕在线| 日本三区在线观看| 日韩 欧美一区二区三区| 中文字幕国产传媒| 麻豆国产精品777777在线| 色乱码一区二区三区在线| 久久99精品国产麻豆婷婷洗澡| 亚洲理论中文字幕| 国产乱淫av一区二区三区| 人妻精品久久久久中文字幕69| 国产精品自拍一区| 国产国语老龄妇女a片| 99免费精品在线观看| 深爱五月激情网| 亚洲国产精品成人综合| 国产午夜手机精彩视频| 夜夜精品浪潮av一区二区三区| 久久精品无码人妻| 色综合天天综合色综合av| 中文字幕91爱爱| 777xxx欧美| 欧美性猛交 xxxx| 亚洲欧美制服丝袜| 免费在线观看黄色网| 久操成人在线视频| 涩涩视频在线免费看| 国产精品久久久一区| 国产免费区一区二区三视频免费| 99精品国产一区二区| 天海翼精品一区二区三区| 日韩一区二区电影在线观看| 91精品久久久久久久久久不卡| 日韩人妻无码精品久久久不卡| 欧美资源在线| 中文字幕线观看| 99视频超级精品| 日本黄区免费视频观看| 一二三区精品福利视频| 国内精品福利视频| 欧美顶级少妇做爰| 日韩一级片免费看| 国产一区二区三区视频| 污污视频在线| 日本久久精品视频| 精品欧美视频| 欧美另类高清视频在线| 在线观看日韩| 精品久久久久久久免费人妻| 国产电影一区二区三区| 亚洲国产日韩一区无码精品久久久| 一区二区三区在线影院| www.com亚洲| 精品国产亚洲在线| 超碰免费在线观看| 性欧美视频videos6一9| 日韩一级特黄| 欧美极品jizzhd欧美| 欧美黄在线观看| 视色视频在线观看| 99久久99久久免费精品蜜臀| 国产一区二区精彩视频| 色嗨嗨av一区二区三区| 老牛影视av牛牛影视av| 久久久999成人| 超薄肉色丝袜脚交一区二区| 国产精品美女黄网| 91精品国产91久久久久久密臀| 成人久久久久久久久| 成人一区二区视频| 小泽玛利亚一区二区免费| 在线视频中文字幕一区二区| 黄色一级a毛片| 色综合久综合久久综合久鬼88 | 黄色一区二区在线观看| 一个人看的www日本高清视频| 亚洲乱码一区av黑人高潮| 国产精品69xx| 91免费综合在线| 日韩一区二区在线| 免费在线观看的av网站| 99在线精品观看| 玖玖爱免费视频| 欧美一区二区三区性视频| 在线观看免费版| 国产精品黄页免费高清在线观看| 婷婷激情久久| 欧美s码亚洲码精品m码| 国产a视频精品免费观看| 国产成人久久久久| 欧美一区二区三区四区久久| 日韩伦理在线观看| 成人国产亚洲精品a区天堂华泰| 欧美日韩国产免费观看视频| 欧美成人免费高清视频| 91麻豆免费看片| 久久久久久久久久免费视频| 精品处破学生在线二十三| 三级网站视频在在线播放| 51国偷自产一区二区三区的来源| 一区二区免费不卡在线| 91在线第一页| 一区二区三区鲁丝不卡| www.国产黄色| 欧美国产在线视频| 老牛精品亚洲成av人片| 国产老熟妇精品观看| av不卡在线播放| 日本在线播放视频| 亚洲日本欧美中文幕| 日本高清不卡一区二区三区视频| 欧美一区二区三区电影在线观看| 久久婷婷麻豆| 亚洲天堂精品一区| 91麻豆精品国产| 女同一区二区免费aⅴ| 国产在线一区二区三区四区| 国产精品一页| 娇妻被老王脔到高潮失禁视频| 欧美日韩国产乱码电影| 99久久精品免费观看国产| 国产精品久久国产三级国电话系列 | 亚洲成人免费在线视频| 日本黄色免费在线| 色综合666| 国内精品视频一区二区三区八戒| 久久精品国产亚洲av无码娇色| 亚洲欧美国内爽妇网| 福利视频一区| 久久国产午夜精品理论片最新版本| 91视频观看视频| 亚洲视频在线观看免费视频| 九九久久久久久久久激情| 无码日韩精品一区二区免费| 一级做a免费视频| 亚洲午夜一二三区视频| 免费国产在线视频| 91亚洲一区精品| 亚洲欧美日韩国产一区二区| 成人三级视频在线观看| 亚洲成人网久久久| 国产91欧美| 亚洲中文字幕无码一区二区三区| 26uuu成人网一区二区三区| 亚洲天堂中文字幕在线| 97精品视频在线播放| 日韩激情在线| 中文字幕无码人妻少妇免费| 欧美美女视频在线观看| 乱人伦视频在线| 国产精品jizz在线观看老狼| www久久久久| 99视频免费看| 国产精品专区第二| 免费亚洲网站| 久久国产在线观看|