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

記一次 .NET某工業設計軟件崩潰分析

開發 前端
一般來說崩潰在clr里都不是什么好事情,這預示著 clr 在執行自身代碼的時候拋了異常,即災難的 ExecutionEngineException,可以用 !t 驗證下。

一、背景

1. 講故事

前些天有位朋友找到我,說他的軟件在客戶那邊不知道什么原因崩掉了,從windows事件日志看崩潰在 clr 里,讓我能否幫忙定位下,dump 也抓到了,既然dump有了,接下來就上 windbg 分析吧。

二、WinDbg 分析

1. 為什么崩潰在 clr

一般來說崩潰在clr里都不是什么好事情,這預示著 clr 在執行自身代碼的時候拋了異常,即災難的 ExecutionEngineException,可以用 !t 驗證下。

0:000> !t
ThreadCount:      18
UnstartedThread:  0
BackgroundThread: 7
PendingThread:    0
DeadThread:       11
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 52e8 18998d50     24220 Preemptive  639B0D58:00000000 18c361f0 0     STA System.ExecutionEngineException 1f421120
   ...

既然是災難性異常,那為什么會出現呢?可以用 !analyze -v 觀察下。

0:000> !analyze -v
CONTEXT:  0115a98c -- (.cxr 0x115a98c)
eax=00000000 ebx=00000000 ecx=00000000 edx=18c364a4 esi=00030000 edi=18998d50
eip=552bfff1 esp=0115ae6c ebp=0115af24 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246
clr!VirtualCallStubManager::ResolveWorker+0x33:
552bfff1 8bb968020000    mov     edi,dword ptr [ecx+268h] ds:002b:00000268=????????
Resetting default scope

READ_ADDRESS:  00000268 

STACK_TEXT:  
0115af24 552c0698     0115afdc 1f4222c0 00030000 clr!VirtualCallStubManager::ResolveWorker+0x33
0115affc 552c070b     0115b010 1f4222c0 00030000 clr!VSD_ResolveWorker+0x1d2
0115b024 28a3a949     639b0d38 00000000 00000000 clr!ResolveWorkerAsmStub+0x1b
0115b0a4 28a3a8bd     00000000 00000000 00000000 xxxx!xxx
...

我去,真無語了,我卦中數據看,這是一個接口Stub調用的崩潰,在這里崩潰真的是少之又少,從匯編代碼 edi,dword ptr [ecx+268h] ds:002b:00000268=???????? 上看就是因為 ecx =0 導致的,接下來觀察下方法的匯編代碼。

圖片圖片

從匯編上看這個 ecx 其實就是這個方法的 this 指針,那為什么 this =null 呢?這就很奇葩了。

2. 為什么 this =null

要想找到這個答案,只能看clr源代碼,簡化后如下:

PCODE VSD_ResolveWorker(TransitionBlock* pTransitionBlock,
                        TADDR siteAddrForRegisterIndirect,
                        size_t token
                        )
{
    ...
    VirtualCallStubManager::StubKind stubKind = VirtualCallStubManager::SK_UNKNOWN;
    VirtualCallStubManager* pMgr = VirtualCallStubManager::FindStubManager(callSiteTarget, &stubKind);
    
    ...
    target = pMgr->ResolveWorker(&callSite, protectedObj, representativeToken, stubKind);
}

從卦中代碼看,問題就是 pMgr=null 導致的,無語了,這個 VirtualCallStubManager::FindStubManager 方法的本意就是根據 callSite的stub的前綴找到對應的 虛調用管理器,它的核心邏輯如下:

StubKind getStubKind(PCODE stubStartAddress, BOOL usePredictStubKind = TRUE)
{
    StubKind predictedKind = (usePredictStubKind) ? predictStubKind(stubStartAddress) : SK_UNKNOWN;
    ...
    if (predictedKind == SK_LOOKUP)
    {
        if (isLookupStub(stubStartAddress))
            return SK_LOOKUP;
    }
    ...
    return SK_UNKNOWN;
}

VirtualCallStubManager::StubKind VirtualCallStubManager::predictStubKind(TADDR stubStartAddress)
{
    StubKind stubKind = SK_UNKNOWN;

    WORD firstWord = *((WORD*)stubStartAddress);

    if (firstWord == 0x05ff)
    {
        stubKind = SK_DISPATCH;
    }
    else if (firstWord == 0x6850)
    {
        stubKind = SK_LOOKUP;
    }
    else if (firstWord == 0x8b50)
    {
        stubKind = SK_RESOLVE;
    }

    return stubKind;
}

接下來需要找到 stubStartAddress 的地址是多少?這個只需要提取 ResolveWorker 方法的第一個參數 callSite 即可。

0:000> dp poi(0115afdc) L1
0c740040  0c746012

0:000> u 0c746012
0c746012 50              push    eax
0c746013 6800000300      push    30000h
0c746018 e9d3a6b748      jmp     clr!ResolveWorkerAsmStub (552c06f0)
0c74601d 0000            add     byte ptr [eax],al
0c74601f 0000            add     byte ptr [eax],al
0c746021 005068          add     byte ptr [eax+68h],dl
0c746024 0000            add     byte ptr [eax],al
0c746026 46              inc     esi

0:000> dp 0c746012 L1
0c746012  00006850

對比剛才的代碼既然都返回來了 SK_LOOKUP 那為什么還是 SK_UNKNOWN 呢?這個也可以通過在線程棧上找到 &stubKind 變量得到驗證。

0:000> uf 552c0698
...
clr!VSD_ResolveWorker+0x1ab:
552c065f 8b85e0ffffff    mov     eax,dword ptr [ebp-20h]
552c0665 83a5ecffffff00  and     dword ptr [ebp-14h],0
552c066c 8d95ecffffff    lea     edx,[ebp-14h]
552c0672 8b08            mov     ecx,dword ptr [eax]
552c0674 e858feffff      call    clr!VirtualCallStubManager::FindStubManager (552c04d1)
552c0679 ffb5ecffffff    push    dword ptr [ebp-14h]
552c067f 51              push    ecx
552c0680 8bcc            mov     ecx,esp
552c0682 8931            mov     dword ptr [ecx],esi
552c0684 ffb5e8ffffff    push    dword ptr [ebp-18h]
552c068a 8d8de0ffffff    lea     ecx,[ebp-20h]
552c0690 51              push    ecx
552c0691 8bc8            mov     ecx,eax
552c0693 e823f9ffff      call    clr!VirtualCallStubManager::ResolveWorker (552bffbb)
552c0698 8bf0            mov     esi,eax
...

0:000> dp 0115affc-0x14 L1
0115afe8  00000000

我感覺這邏輯也只有clr團隊幫忙解釋,我已經搞不清楚了,接下來我們回頭看托管方法,看能不能繼續下去。

3. 在托管層尋找突破口

高級調試就是這樣,一個方向走不通就需要在另一個方向上突破,接下來使用 !clrstack 觀察一下。

0:000> !clrstack
OS Thread Id: 0x52e8 (0)
Child SP       IP Call Site
0115af50 775c2aac [GCFrame: 0115af50] 
0115afac 775c2aac [StubDispatchFrame: 0115afac]xxx.GetListDrawerType(System.String)
0115b02c 28a3a949 xxx.PluginInvoker.InvokeMothod[[System.__Canon, mscorlib]](System.String, System.Object[])
0115b0b0 28a3a8bd xxx.xxx.OnFinishSizeCheck(Int64)
...

從調用棧來看,貌似是用反射來實現功能增強,不管怎么說先看下xxxCheck 方法干了什么?簡化后的代碼如下:

public string OnFinishSizeCheck(long uuid)
{
    return PluginInvoker.InvokeMothod<string>("xxxCheck", new object[1] { uuid });
}

public static T InvokeMothod<T>(string methodName, params object[] args)
{
    IPluginInvoker pluginInvoker = GetPluginInvoker();

    return (T)pluginInvoker.InvokeMothod(methodName, args);
}

從代碼上可以看到原來是使用 (T)pluginInvoker.InvokeMothod(methodName, args); 實現的接口調用,在coreclr層面也能觀察得到,找到對象 1f4222c0 之后按圖索驥即可。

0:000> !do 1f4222c0
Name:        xxx.xxx.BusinessAppDomainInvoker
MethodTable: 0c73a144
EEClass:     0c6d6f0c
Size:        12(0xc) bytes
File:        E:\xxx\xxx.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
0c73a4e8  400000a        4 ....AppDomainManager  0 instance 1f42236c appDomainManager
0c73a2dc  4000009       18 ..., xxx]]  0   static 1f422214 lazy

0:000> !dumpmt -md 0c73a144
EEClass:         0c6d6f0c
Module:          0c7383dc
Name:            xxx.xxx.BusinessAppDomainInvoker
mdToken:         02000006
File:            E:\xxx\xxx.dll
BaseSize:        0xc
ComponentSize:   0x0
Slots in VTable: 10
Number of IFaces in IFaceMap: 1
--------------------------------------
MethodDesc Table
   Entry MethodDe    JIT Name
   ...
0c6c3400 0c73a110    JIT xxx.xxx.InvokeMothod(System.String, System.Object[])

0:000> !do  poi(0c73a144+0x24)
Name:        xxx.IPluginInvoker
MethodTable: 0c739f30
EEClass:     0c6d6d34
Size:        0(0x0) bytes
File:        E:\xxx\xxx.dll
Fields:
None
ThinLock owner 1 (18998d50), Recursive 0

對比那個 token=30000h 發現什么地方都沒有問題,奇葩的就是一個簡單接口調用就出現了問題,仔細觀察代碼之后發現了兩個和別人不一樣的地方。

4. 與眾不同的地方在哪里

第一個是他的程序是多 AppDomain 的,可以用 !dumpdomain 觀察。

0:000> !dumpdomain
--------------------------------------
System Domain:      55a6caa0
...
--------------------------------------
Shared Domain:      55a6c750
LowFrequencyHeap:   55a6cdc4
Stage:              OPEN
--------------------------------------
Domain 1:           18b04690
LowFrequencyHeap:   18b04afc
Name:               DefaultDomain
--------------------------------------
Domain 2:           18c361f0
LowFrequencyHeap:   18c3665c
...

第二個是我發現托管調用棧上還有很多 托管C++,這種混合編程真的是無語了。

到這里我想到了三個辦法:

1)如果可以先把接口方法預熱,clr會直接把方法入口塞到匯編里,就不會再走clr底層邏輯了。

2)能否將 托管C++ 和 C# 隔離,不要混合編程。

3)重點觀察下多Domain下這個托管調用是不是有什么問題。

三、總結

這種 多domain + 托管C++混合C# 編程,真出問題了基本上就是無解,一般人hold不住,無語了。

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

2024-12-27 13:31:18

.NETdump調試

2023-06-26 00:12:46

2024-03-28 12:56:36

2024-07-12 11:20:34

.NET崩潰視覺程序

2024-03-26 00:44:53

.NETCIM系統

2023-03-26 20:24:50

ERP網站系統

2022-10-25 14:17:01

.NET代碼程序

2024-07-09 11:51:20

Windows線程池源碼

2025-10-29 01:11:00

.NET系統windows

2023-06-29 17:55:00

.NET日志WinDbg

2024-06-13 17:09:55

2024-06-04 10:54:34

.NET代碼程序

2023-09-27 07:23:10

.NET監控軟件

2023-05-15 11:15:50

.NET門診語句

2023-10-07 13:28:53

.NET軟件賬本

2025-09-02 01:35:00

.NET光學定位軟件

2022-10-09 10:47:37

NET視覺軟件

2025-09-05 02:22:00

.NETCRM物流行業

2023-04-06 10:52:18

2024-08-27 13:08:50

點贊
收藏

51CTO技術棧公眾號

国产乱子伦精品无码专区| 国产不卡av在线| 中文字幕人妻熟女人妻a片| av免费在线网站| jiyouzz国产精品久久| 91精品国产精品| 美女100%露胸无遮挡| 精品国产三级| 色综合天天性综合| 欧美与动交zoz0z| 天堂av在线资源| 极品少妇一区二区| 欧美中文字幕在线播放| 国产精品综合激情| 偷拍亚洲色图| 欧美一区二区福利视频| 国产极品美女高潮无套久久久| 欧美国产综合视频| 久久久久久久99| 日韩久久精品网| 亚洲国产小视频在线观看| 最新中文字幕2018| av蜜臀在线| 国产精品女主播av| 精品国产aⅴ麻豆| 国产女人高潮时对白| 国产亚洲成人一区| 久久综合色88| 蜜桃传媒一区二区亚洲| 丁香婷婷成人| 91麻豆精品国产91久久久久| 国产一区亚洲二区三区| 高h视频在线播放| 中文字幕一区二区三区在线观看| 精品视频免费观看| 草逼视频免费看| 国内精品自线一区二区三区视频| 日本在线观看天堂男亚洲| 国产在线拍揄自揄拍| 亚洲成av人片乱码色午夜| 亚洲视频综合网| 大地资源二中文在线影视观看| 精品国产一级| 欧美精品成人一区二区三区四区| 十八禁视频网站在线观看| 日韩激情电影| 香蕉成人啪国产精品视频综合网| 欧美黄网在线观看| av中文字幕在线| 国产三级久久久| 秋霞久久久久久一区二区| 姝姝窝人体www聚色窝| 成人短视频下载| 成人午夜电影在线播放| 国产成人麻豆精品午夜在线| 久久电影网电视剧免费观看| 国产精品看片资源| 欧美一级黄视频| 全国精品久久少妇| 国产精品综合网站| 伊人久久成人网| 日韩激情在线观看| 国产精品久久久久久久久久新婚 | 欧美最猛性xxxxx(亚洲精品)| 69精品久久久| 国产欧美日本| 日韩美女视频免费在线观看| 精品国产乱子伦| 日本午夜一区二区| 91精品久久久久久久久中文字幕| 国产深喉视频一区二区| 国产精品1区2区| 高清国产在线一区| 香港三日本三级少妇66| 久久九九国产精品| 亚洲精品中文字幕在线| 国产区在线观看| 亚洲第一激情av| 亚洲色欲综合一区二区三区| 电影一区电影二区| 91精品国产欧美一区二区成人| 原创真实夫妻啪啪av| 99精品中文字幕在线不卡 | 一个色的综合| 欧美人体视频xxxxx| 精品动漫一区二区| av在线无限看| 日韩在线网址| 亚洲人成在线电影| 91免费公开视频| av成人黄色| 国产精品中文在线| 欧美 日韩 综合| 国产日产欧美一区二区视频| 国产高清免费在线| 九色porny丨国产首页在线| 欧美吻胸吃奶大尺度电影| 亚洲五月激情网| 亚洲欧美校园春色| 欧美成人黑人xx视频免费观看| 国产免费观看av| 韩国av一区二区| 欧美日韩成人一区二区三区| 深夜国产在线播放| 91福利区一区二区三区| 精产国品一二三区| 国产中文字幕一区二区三区| 欧美成人性生活| 69视频免费看| 成人午夜精品在线| 最新国产精品久久| 中文在线免费视频| 欧美一级高清片在线观看| 波多野结衣a v在线| 国产精品地址| 成人久久精品视频| 毛片免费在线观看| 亚洲一区二区视频| 中文字幕在线视频精品| 蜜桃一区二区三区| 欧美国产乱视频| 一区二区三区午夜| 国产网站一区二区| 人妻熟妇乱又伦精品视频| 久久天堂久久| 日韩一区二区在线视频| 欧美a视频在线观看| 成年人网站91| 欧美日韩dvd| 国产精品视频首页| 中文字幕久热精品在线视频| 国产一级片免费在线观看| 成人黄色a**站在线观看| 国产免费一区二区三区四在线播放 | 成人资源在线| 色综合老司机第九色激情| 艳妇乳肉豪妇荡乳av无码福利 | 娇小11一12╳yⅹ╳毛片| 奶水喷射视频一区| 久久99精品国产一区二区三区| 肉肉视频在线观看| 欧美大片国产精品| 亚洲最大的黄色网址| 老司机精品视频在线| 日韩精品一线二线三线| 中文在线аv在线| 亚洲免费av网址| 五月天婷婷激情| 2022国产精品视频| 国产91对白刺激露脸在线观看| 国产精品sss在线观看av| 欧美贵妇videos办公室| 成人免费视频国产免费麻豆| 亚洲五月六月丁香激情| av在线天堂网| 亚洲精品精选| 久久精品国产精品国产精品污| 青青青免费在线视频| 日韩精品极品在线观看| aaaaaa毛片| 欧美激情在线观看视频免费| 一本色道久久亚洲综合精品蜜桃 | 日韩中文字幕在线看| 6—12呦国产精品| 亚洲欧美色图小说| 国产精久久久久| 国产日韩亚洲欧美精品| 欧美日韩大片一区二区三区 | 欧美男女性生活在线直播观看| 国产福利视频网站| 成人在线综合网| 久久久久久久激情| 日本黄色精品| 91精品国产91久久久久青草| 2020国产在线| 亚洲午夜久久久影院| 亚洲综合精品在线| 亚洲乱码国产乱码精品精98午夜| 蜜臀视频在线观看| 久久精品官网| 男人的天堂成人| 卡一精品卡二卡三网站乱码| 国产精品久久久久免费a∨大胸| 欧美高清视频| 亚洲国产欧美精品| 五月婷婷丁香在线| 亚洲黄色小说网站| 国产精品无码久久久久一区二区| 男男成人高潮片免费网站| 男人的天堂视频在线| 日韩精品福利一区二区三区| 国产精品永久免费观看| 不卡av免费观看| 中文字幕日本欧美| 色窝窝无码一区二区三区| 欧美色欧美亚洲另类二区| 国产乱国产乱老熟300| 久久伊人蜜桃av一区二区| 超碰人人草人人| 一区二区三区四区五区在线 | 狂野欧美一区| 97在线免费视频观看| 视频一区在线观看| 99re6热在线精品视频播放速度| 黑人巨大精品| 欧美日本高清一区| 日本欧美在线视频免费观看| 日韩理论片久久| www五月婷婷| 欧美色国产精品| 国产成人免费看| 亚洲另类在线一区| 国产福利在线导航| 久久久久久**毛片大全| av不卡中文字幕| 国产在线一区二区| 在线免费视频a| 国产欧美二区| 日韩一级片免费视频| 亚洲欧美综合久久久| 色一情一乱一伦一区二区三区丨 | 一本色道久久88综合亚洲精品ⅰ | 国内外成人激情视频| 亚洲视频一区| 操bbb操bbb| 久久一区二区三区喷水| 欧美日韩精品久久| 亚洲精品动态| 美国av一区二区三区| 福利欧美精品在线| www.久久草| 欧美视频精品全部免费观看| 成人精品久久一区二区三区| 日韩av电影资源网| 国产成人97精品免费看片| 日韩在线伦理| 2020国产精品视频| 欧美男男tv网站在线播放| 91国在线精品国内播放| 狂野欧美性猛交xxxxx视频| 久久99热精品| 日本乱理伦在线| 欧美日本中文字幕| 在线观看h网| 久久99视频精品| 美女航空一级毛片在线播放| 欧美激情免费在线| 密臀av在线| 久久人91精品久久久久久不卡| 手机av免费在线| 久久久久久久久久亚洲| 国产三线在线| 97成人精品视频在线观看| 超级白嫩亚洲国产第一| 97精品在线观看| 欧美在线极品| 国产精品福利在线| 九九热这里有精品| 成人女保姆的销魂服务| 国产一区二区久久久久| 999热视频| 久久精品国产亚洲5555| 欧美三日本三级少妇三99| 红桃成人av在线播放| 色之综合天天综合色天天棕色| 久久一区二区三区喷水| 亚洲小视频在线播放| 亚洲高清免费| 91淫黄看大片| 韩国毛片一区二区三区| 亚洲成a人无码| 久久―日本道色综合久久| 亚洲色图日韩精品| 亚洲精品国产第一综合99久久| 久久视频免费在线观看| 一本色道a无线码一区v| 亚洲图片小说视频| 欧美成人国产一区二区| 日韩电影网址| 俺去了亚洲欧美日韩| gratisvideos另类灌满| 国产成人免费av| 久久影院一区二区三区| 精品国产乱码久久久久久蜜柚| 国产精品三级| 老司机午夜免费福利视频| 羞羞答答国产精品www一本| 伊人国产在线视频| 99久久精品99国产精品| 极品人妻videosss人妻| 亚洲精品国产a| 免费的毛片视频| 日韩一区二区三区电影| 精品三级久久久久久久电影聊斋| 久久婷婷国产麻豆91天堂| 成人免费图片免费观看| 亚洲欧美一区二区精品久久久| 日韩视频一区在线| av网在线观看| 欧美激情一区二区三区久久久| 91精品论坛| 成人免费网站在线观看| 日韩电影不卡一区| 无遮挡亚洲一区| aaa在线观看| 中日韩免费视频中文字幕| 亚洲欧洲偷拍精品| 又爽又大又黄a级毛片在线视频| 欧美成人免费视频| 欧美一区久久久| 懂色一区二区三区av片| 精品国产中文字幕第一页| 青草全福视在线| 久久aⅴ国产紧身牛仔裤| 欧美熟妇另类久久久久久多毛| aaa欧美色吧激情视频| 三级黄色在线观看| 欧美特黄级在线| 亚洲第九十九页| www.亚洲免费视频| 亚洲午夜天堂| 99久久精品免费看国产一区二区三区| 亚洲三级av| 日本不卡一区| 免费看的黄色欧美网站| 国产大尺度视频| 亚洲精品视频一区二区| 中文在线免费看视频| 国产视频欧美视频| 成人免费网站观看| 91九色在线观看| 五月综合激情| 182午夜在线观看| 中文幕一区二区三区久久蜜桃| 国产一级一级国产| 日韩电影中文字幕在线| 国产美女一区视频| 亚洲一区二区免费在线| 午夜欧美在线| 午夜天堂在线视频| 国产精品久久久一本精品| 日韩国产亚洲欧美| 在线视频国产日韩| 亚洲不卡系列| 日韩欧美亚洲在线| 日韩精品亚洲一区二区三区免费| 成年人在线观看av| 午夜电影网亚洲视频| 丰满人妻一区二区三区免费视频| 日韩中文在线不卡| 国产精品高潮久久| 亚洲一区二区三区涩| 久久精品理论片| 91社区视频在线观看| 欧美系列一区二区| 五月天婷婷在线视频| 国产精品视频一区二区三区四| 日韩欧美中文| 性生活在线视频| 亚洲一区二区在线观看视频| 色婷婷在线视频| 2019日本中文字幕| 久久99久久人婷婷精品综合 | 精品少妇一区二区三区视频免付费 | 国产欧美一区二区精品性色超碰 | 久草免费在线视频| 国产综合av一区二区三区| 西西人体一区二区| 一级特黄曰皮片视频| 欧美久久久久久蜜桃| 91蜜桃在线视频| 国精产品一区二区| 日韩精品三区四区| 99成人在线观看| 日韩欧美国产综合一区| 国产丝袜精品丝袜| 免费在线成人av| 男人的天堂久久精品| 性色国产成人久久久精品| 欧美一区二区女人| 成人免费一区二区三区牛牛| 国产精品三区www17con| 欧美中文日韩| 日本黄色片免费观看| 精品国产乱码久久久久久1区2区| 色黄视频在线观看| 色一情一区二区三区四区| 国产麻豆精品一区二区| 国产成人愉拍精品久久| 中文字幕日韩av电影| 亚洲网址在线观看| 亚洲 中文字幕 日韩 无码| 亚洲品质自拍视频网站| 91精品小视频| 欧美福利视频导航| 日韩激情电影| 欧美 国产 精品| 国产欧美日韩另类一区| 亚洲av少妇一区二区在线观看| 国产精品日韩专区|