精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91久久久亚洲精品| 日日骚av一区| 欧美国产亚洲一区| 懂色av中文在线| 国产美女一区二区三区| 国语对白做受69| 人成免费在线视频| 亚洲综合网狠久久| 欧美小视频在线观看| 亚洲一一在线| 天天色天天操天天射| 美女视频黄 久久| 国外色69视频在线观看| 久久视频精品在线观看| 2020最新国产精品| 欧美亚洲综合一区| a天堂资源在线观看| 高清性色生活片在线观看| 国产在线播精品第三| 7777精品久久久久久| 91ts人妖另类精品系列| 欧美交a欧美精品喷水| 欧美日韩午夜影院| 青青草国产精品视频| 在线观看av的网站| 国产区精品视频在线观看豆花| 欧美视频中文字幕在线| 国产人妻互换一区二区| 成人免费在线观看| 99re亚洲国产精品| 91香蕉国产在线观看| 人人妻人人爽人人澡人人精品| 欧美日本一区二区视频在线观看 | 欧美亚洲视频在线看网址| 波兰性xxxxx极品hd| 综合国产视频| 亚洲第一网中文字幕| 91日韩精品视频| 日本免费久久| 岛国精品视频在线播放| av在线免费观看国产| 国产精品刘玥久久一区| 日本一区二区三区在线观看| 久久99精品久久久久久青青日本| 国产黄色美女视频| 国产一区视频导航| 国产欧美va欧美va香蕉在线| 精品人妻一区二区三区潮喷在线| 99riav1国产精品视频| 欧美激情第6页| 成人高潮免费视频| 国产精品久久久久9999赢消| 中文字幕亚洲第一| 精品无码在线观看| 欧美日韩在线播放视频| 伊人久久综合97精品| 亚洲а∨天堂久久精品2021| 国产精品一区二区av交换| 亚洲欧洲在线视频| 尤物视频最新网址| 久久超碰99| 国产亚洲日本欧美韩国| 影音先锋制服丝袜| 国产精品久久久久久久久妇女| 自拍偷拍免费精品| 欧美第一页在线观看| 伊人色**天天综合婷婷| 欧美极品少妇与黑人| 国产精品黄色网| 国产亚洲综合精品| 日韩欧美在线视频免费观看| 欧美一区综合| 在线成人免费观看| 伊人国产精品视频| 一区二区在线视频观看| 欧美精品一区二区三区视频| 私密视频在线观看| 亚洲综合小说图片| 在线观看精品国产视频| 久久久精品少妇| 欧美午夜不卡影院在线观看完整版免费| 免费99精品国产自在在线| 久久久久久国产精品视频| 亚洲午夜精品久久久久久app| 久久全国免费视频| 精品人妻一区二区三区潮喷在线| 麻豆精品在线观看| 9a蜜桃久久久久久免费| 欧美套图亚洲一区| 国产精品久久久久精k8| 国产一区二区三区在线免费| 国产高清中文字幕在线| 欧美影院精品一区| 国产又黄又嫩又滑又白| 欧美一区自拍| 日日骚久久av| 天海翼一区二区| 免费一区二区视频| 国产精品亚洲综合| 大乳在线免费观看| 亚洲综合男人的天堂| 波多野结衣家庭教师视频| 久久精品资源| 亚洲黄色免费三级| 91精品少妇一区二区三区蜜桃臀| 亚洲国产国产亚洲一二三| 日韩av电影在线网| 精品人妻一区二区三区麻豆91| 99久久亚洲一区二区三区青草 | 五月婷婷之综合激情| 国产精品777777在线播放| 亚洲国产天堂久久综合网| 免费网站在线高清观看| 亚洲成人中文| 成人激情视频在线播放| 欧洲一级在线观看| 亚洲精品国产a久久久久久| 欧美日韩在线不卡视频| 7m精品国产导航在线| 中文字幕日韩欧美在线| 黄色在线观看国产| 国产成人自拍在线| 婷婷久久青草热一区二区| av影院在线免费观看| 欧美美女激情18p| 91网站免费视频| 亚洲激情另类| 91免费在线观看网站| 日韩在线资源| 色综合久久综合| 人妻体内射精一区二区三区| 无需播放器亚洲| 国产精品久久久久久久久免费| 国产又爽又黄网站亚洲视频123| 亚洲激情一二三区| 久久精品亚洲天堂| 日韩欧美在线中字| 日韩美女在线观看| 天堂在线中文| 精品免费在线视频| 国产高潮视频在线观看| 午夜久久一区| 51精品国产人成在线观看 | 国产午夜精品福利| 欧美亚洲日本一区二区三区 | 美女网站久久| 久久精彩视频| 亚洲v.com| 精品视频在线导航| 久久精品视频1| 95精品视频在线| av免费观看网| 日本在线中文字幕一区| 98视频在线噜噜噜国产| 欧美一级特黄aaaaaa| 亚洲一区在线播放| 69xxx免费视频| 在线国产精品一区| 1卡2卡3卡精品视频| 青草影视电视剧免费播放在线观看| 日韩一区二区影院| 少妇影院在线观看| 大桥未久av一区二区三区中文| 日本香蕉视频在线观看| 超碰在线一区| 17婷婷久久www| 精品欧美不卡一区二区在线观看| 欧美性猛交xxxx免费看久久久| 粉嫩av蜜桃av蜜臀av| 日韩中文字幕亚洲一区二区va在线| 欧美日韩在线不卡一区| 国产在视频一区二区三区吞精| xxx一区二区| 亚洲精品国产精| 欧美日韩国产色| 日韩不卡av在线| 激情亚洲综合在线| 99国产精品白浆在线观看免费| 国产日韩三级| 国产精品久久久久久久久久ktv| 在线日本中文字幕| 日韩欧美久久一区| 国产又大又黄又粗| 国产精品美女久久久久久2018| 国内精品国产三级国产aⅴ久| 亚洲国内欧美| 亚洲成人精品电影在线观看| 超碰国产精品一区二页| 欧美—级a级欧美特级ar全黄| 亚州视频一区二区三区| 欧美午夜精品一区二区蜜桃| 日韩va亚洲va欧美va清高| 成人教育av在线| 精品久久久噜噜噜噜久久图片| 香蕉av一区二区| 精品国产乱码久久久久久久软件| 成人福利片在线| 欧美激情xxxx| 成黄免费在线| 亚洲成人久久一区| 中文字幕一区二区免费| 亚洲高清在线精品| 在线免费看视频| 不卡的av网站| 日韩成人av免费| 国产亚洲精品v| 青青草综合视频| 欧美精选一区二区三区| 成人综合av网| 欧美成人免费全部网站| 69av在线视频| 色网在线观看| 中文字幕日韩免费视频| 天堂资源最新在线| 日韩欧美久久久| 最近中文字幕免费在线观看| 午夜精品一区二区三区三上悠亚 | 亚洲综合清纯丝袜自拍| 娇妻被老王脔到高潮失禁视频| 成人国产精品视频| 九九热精品国产| 久热re这里精品视频在线6| 男人添女荫道口女人有什么感觉| 日韩成人精品一区| 欧洲精品久久| 日韩高清影视在线观看| 91精品国产高清久久久久久91裸体| 78精品国产综合久久香蕉| 91av在线视频观看| 国产白丝在线观看| 欧美成人精品xxx| 黄网站免费在线播放| 伊人一区二区三区久久精品 | 俺去啦;欧美日韩| 国产福利在线观看| 亚洲色图狂野欧美| 亚洲aaa在线观看| 日韩一区二区高清| 国产精品伦理一区| 欧美日韩黄视频| 最新中文字幕第一页| 色婷婷综合久久久久中文一区二区| 可以免费看的av毛片| 红桃视频成人在线观看| 国产精品6666| 亚洲国产精品久久人人爱蜜臀| 久久婷婷综合国产| 亚洲精品第一国产综合野| 日韩福利小视频| 亚洲欧美综合在线精品| 91麻豆制片厂| 国产精品国产馆在线真实露脸 | wwwwwxxxx日本| 蜜桃一区二区三区在线| 国产91色在线观看| 精品一二三四在线| www.日本久久| 国产成人啪午夜精品网站男同| 亚洲综合伊人久久| 国产乱码精品一品二品| 国产黄色一区二区三区 | 色天天综合色天天久久| 亚洲欧美偷拍视频| 色婷婷亚洲精品| 自拍偷拍色综合| 欧美丰满少妇xxxbbb| 国产成人av免费看| 亚洲国产精品yw在线观看| 天天色天天操天天射| 亚洲欧美中文字幕在线一区| yw193.com尤物在线| 久久久av免费| xxx.xxx欧美| 青青在线视频一区二区三区| 成人网ww555视频免费看| 成人网页在线免费观看| 日韩精品一区国产| 久久99精品久久久久久秒播放器| 九九精品在线| 男女激烈动态图| 亚洲深爱激情| 天天爱天天操天天干| 国产一区二区三区四| 亚洲一区二区三区无码久久| 亚洲国产精品成人综合色在线婷婷| 国产67194| 狠狠久久五月精品中文字幕| 中文字幕第99页| 欧美刺激午夜性久久久久久久| 天堂在线中文| 久久精品国产精品亚洲| 18aaaa精品欧美大片h| 国产精品jizz在线观看麻豆| 日韩一区网站| 欧美裸体网站| 欧美+亚洲+精品+三区| 女性隐私黄www网站视频| 激情图片小说一区| 手机av免费看| 一区二区理论电影在线观看| 日韩电影在线观看一区二区| 欧美一卡二卡在线观看| 日韩福利一区二区| 久精品免费视频| 成人在线观看免费视频| 古典武侠综合av第一页| 久久亚洲国产| 国产91在线免费| 国产一区二区免费视频| 日本乱子伦xxxx| 亚洲va在线va天堂| 国产精品探花视频| 亚洲精品视频久久| av福利在线导航| 国产精品美女久久久久av超清| 巨人精品**| 特色特色大片在线| 日韩精品久久久久久| 国产精品第七页| 亚洲一卡二卡三卡四卡无卡久久| 特级西西444www高清大视频| 亚洲精品国产精品乱码不99按摩 | 国产精品va在线播放我和闺蜜| 亚洲精品观看| 综合视频在线观看| 日韩不卡一区二区三区| 国产精品边吃奶边做爽| 亚洲夂夂婷婷色拍ww47| 国产精品欧美激情在线| 最近2019中文字幕mv免费看 | 乐播av一区二区三区| 亚洲大片一区二区三区| 国产精品嫩草影院桃色| 日韩在线精品一区| 国产成人福利夜色影视| 热re99久久精品国产99热| 一区二区黄色| 波多野结衣加勒比| 亚洲一区二区四区蜜桃| hs视频在线观看| 久久天天躁狠狠躁夜夜躁2014| 先锋影音网一区二区| 亚洲最大色综合成人av| 久久99久久99精品免视看婷婷| 一区二区精品免费| 91黄视频在线| 成人18在线| 国产日韩欧美视频在线| 日韩在线看片| 亚洲 国产 图片| 国产精品久久久久久户外露出 | 蜜臀久久久久久久| 精品无码在线观看| 欧美三级欧美一级| √天堂资源地址在线官网| 国产日韩av在线| 亚洲人体av| 无人码人妻一区二区三区免费| 亚洲另类一区二区| 亚洲国产精品一| 国产综合在线看| 亚洲另类春色校园小说| 丁香婷婷激情网| 中文字幕综合网| 亚洲经典一区二区| 欧美一级片免费在线| 禁断一区二区三区在线| 亚洲综合欧美激情| 亚洲桃色在线一区| 亚洲免费视频网| 欧美最顶级丰满的aⅴ艳星| 免费一区二区三区视频导航| 国产视频手机在线播放| 亚洲视频在线观看一区| 亚洲AV无码一区二区三区少妇| 69av在线视频| 不卡在线一区| 91超薄肉色丝袜交足高跟凉鞋| 欧美日韩国产一中文字不卡| 高清av在线| 亚洲永久免费观看| 在线视频精品| 在线观看日本黄色| 日韩一级二级三级精品视频| 在线天堂新版最新版在线8| 亚洲欧美日韩精品综合在线观看| 国产福利一区二区三区视频| 人妻丰满熟妇av无码区| xxx一区二区| 亚洲品质自拍| 在线播放黄色av| 黑人狂躁日本妞一区二区三区 | 国产精品乱码一区二三区小蝌蚪| 国产富婆一级全黄大片| 热久久这里只有精品| 希岛爱理一区二区三区| 9.1成人看片免费版| 91精品国产一区二区人妖| 欧美一区国产| 久久综合久久久久|