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

C#托管堆遭破壞問題溯源分析

開發 前端
從代碼邏輯看,只要 Alloc(str)? 的線程棧上觸發了 GC 就是第一現場,Task 下的 GC.Collect(); 是第二現場,如果是前者目的就達到了。

一、背景

1. 講故事

年前遇到了好幾例托管堆被損壞的案例,有些運氣好一些,從被破壞的托管堆內存現場能觀測出大概是什么問題,但更多的情況下是無法做出準確判斷的,原因就在于生成的dump是第二現場,借用之前文章的一張圖,大家可以理解一下。

圖片圖片

為了幫助更多受此問題困擾的朋友,這篇來整理一下如何 快狠準 的抓取第一現場。

二、抓取第一現場

1. 思路分析

要想抓到第一現場,只需要讓破壞托管堆的那個線程在修改完之后,回到 CLR Pinvoke 層的時候主動觸發GC,因為這時候托管堆已經是損壞狀態了,程序也就會立即崩潰,破壞線程也就被捉jian在床,畫個圖如下:

圖片圖片

那如何讓 CLR:PInvoke 主動觸發GC呢?這就需要借助微軟的 MDA 托管調試助手,它有一個 gcUnmanagedToManaged 配置項就是專門做這件事情的,參考網址:https://learn.microsoft.com/zh-cn/dotnet/framework/debug-trace-profile/gcunmanagedtomanaged-mda

2. 如何配置 MDA

MDA 的配置非常簡單,大體上分兩步:

  1. 提交注冊表開啟MDA

這里使用注冊表的方式,需要注意的是,程序和操作系統位數一致的話采用如下方式。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

如果不一致,采用如下配置,比如 32bit 程序跑在 64bit 系統上。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
"MDA"="1"

這里我用的是第二段內容,按照官方文檔描述,將內容保存到 MDAEnable.reg 中,然后在 注冊表編輯器 上導入即可。

圖片圖片

開啟應用程序級捕獲

為了能夠讓 gcUnmanagedToManaged 生效,需要新建應用程序打頭的配置文件,比如:Example_16_1_2.exe.mda.config,內容如下:

<mdaConfig>
 <assistants>
  <gcUnmanagedToManaged/>
 </assistants>
</mdaConfig>

完整截圖:

圖片圖片

這樣就算配置好了,當程序在 PInvoke 時,CLR 會讀取注冊表的 MDA 值,如果開啟的話就會讀取 config 中 gcUnmanagedToManaged 子節做相應的邏輯。

tips:如果配置不生效,保守一點的話,建議重啟下機器。

3. 一個托管堆破壞的測試案例

為了演示托管堆損壞,我準備將一個 string 傳給 C++,然后讓 C++ 溢出它來實現托管堆破壞。

C# 代碼如下:

namespace Example_16_1_2
{
    internal class Program
    {
        [DllImport("Example_16_1_3.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
        public extern static void Alloc(string str);

        static void Main(string[] args)
        {
            Test();

            Task.Factory.StartNew(() =>
            {
                Thread.Sleep(3000);
                GC.Collect();
            });

            Console.ReadLine();
        }

        static void Test()
        {
            var str = "hello";
            var str2 = "world!";

            Alloc(str);

        }
    }
}

C++ 代碼如下:

extern "C"
{
 _declspec(dllexport) void Alloc(wchar_t* c);
}

#include "iostream"
#include <Windows.h>
using namespace std;

void Alloc(wchar_t* c)
{
 for (size_t i = 0; i < 10; i++)
 {
  *c++ = 'a';
 }

 wprintf(L"%s \n", c);
}

從代碼邏輯看,只要 Alloc(str) 的線程棧上觸發了 GC 就是第一現場,Task 下的 GC.Collect(); 是第二現場,如果是前者目的就達到了。

激動人心的時刻到了,把程序跑起來后,由于程序崩潰,procdump 立即給我抓了一個 crash dump,截圖如下:

圖片圖片

接下來打開 windbg,從序幕信息看果然是 GC 清掃的時候出的問題,托管堆也是損壞狀態,信息如下:

Debug session time: Sun Jan 29 10:14:21.000 2023 (UTC + 8:00)
System Uptime: 0 days 1:14:11.423
Process Uptime: not available
.................................
Loading unloaded module list
..
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(4460.52ac): Access violation - code c0000005 (first/second chance not available)
For analysis of this file, run !analyze -v
eax=00610060 ebx=00000000 ecx=02da23a4 edx=00000001 esi=02da2370 edi=02da2388
eip=79a6f2d1 esp=00d3ef64 ebp=00d3f104 iopl=0         nv up ei pl nz na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010206
clr!WKS::gc_heap::plan_phase+0x79b:
79a6f2d1 f70000000080    test    dword ptr [eax],80000000h ds:002b:00610060=????????

0:000> !VerifyHeap
Could not request method table data for object 02DA1228 (MethodTable: 0000000C).
Last good object: 02DA121C.
object 03da1020: bad member 02DA1228 at 03DA1098
Last good object: 03DA1010.
object 03da2338: bad member 02DA1228 at 03DA2340
Last good object: 03DA2328.
object 03da3568: bad member 02DA2364 at 03DA357C
Last good object: 03DA3558.
Failed to request SyncBlk at index 1.

那是不是主線程引發的GC呢?切過去便知。

0:000> ~0s
eax=00610060 ebx=00000000 ecx=02da23a4 edx=00000001 esi=02da2370 edi=02da2388
eip=79a6f2d1 esp=00d3ef64 ebp=00d3f104 iopl=0         nv up ei pl nz na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010206
clr!WKS::gc_heap::plan_phase+0x79b:
79a6f2d1 f70000000080    test    dword ptr [eax],80000000h ds:002b:00610060=????????
0:000> !clrstack
OS Thread Id: 0x52ac (0)
Child SP       IP Call Site
00d3f220 79a6f2d1 [HelperMethodFrame: 00d3f220] System.StubHelpers.StubHelpers.TriggerGCForMDA()
00d3f294 02bc0aa7 DomainBoundILStubClass.IL_STUB_PInvoke(System.String)
00d3f298 02bc09c9 [InlinedCallFrame: 00d3f298] Example_16_1_2.Program.Alloc(System.String)
00d3f2e0 02bc09c9 Example_16_1_2.Program.Test() [D:\testdump\Example\Example_16_1_2\Program.cs @ 35]
00d3f2f0 02bc0900 Example_16_1_2.Program.Main(System.String[]) [D:\testdump\Example\Example_16_1_2\Program.cs @ 19]
00d3f490 7996f036 [GCFrame: 00d3f490] 
0:000> k 10
 # ChildEBP RetAddr      
00 00d3f104 79a68153     clr!WKS::gc_heap::plan_phase+0x79b
01 00d3f124 79a6847b     clr!WKS::gc_heap::gc1+0xbc
02 00d3f13c 79a68585     clr!WKS::gc_heap::garbage_collect+0x367
03 00d3f15c 79b1ddbd     clr!WKS::GCHeap::GarbageCollectGeneration+0x1bd
04 00d3f16c 79b1de34     clr!WKS::GCHeap::GarbageCollectTry+0x71
05 00d3f198 79d20aed     clr!WKS::GCHeap::GarbageCollect+0xac
06 00d3f204 79d066c0     clr!TriggerGCForMDAInternal+0x7d
07 00d3f28c 02bc0aa7     clr!StubHelpers::TriggerGCForMDA+0x61
WARNING: Frame IP not in any known module. Following frames may be wrong.
08 00d3f2d8 02bc09c9     0x2bc0aa7
09 00d3f2e8 02bc0900     Example_16_1_2!Example_16_1_2.Program.Test+0x39 [D:\testdump\Example\Example_16_1_2\Program.cs @ 35] 
0a 00d3f318 7996f036     Example_16_1_2!Example_16_1_2.Program.Main+0x30 [D:\testdump\Example\Example_16_1_2\Program.cs @ 19] 
0b 00d3f324 799722da     clr!CallDescrWorkerInternal+0x34
0c 00d3f378 7997859b     clr!CallDescrWorkerWithHandler+0x6b
0d 00d3f3ec 79b1b11b     clr!MethodDescCallSite::CallTargetWorker+0x16a
0e 00d3f510 79b1b7fa     clr!RunMain+0x1b3
0f 00d3f77c 79b1b727     clr!Assembly::ExecuteMainMethod+0xf7

從線程棧上的 clr!StubHelpers::TriggerGCForMDA 來看,在 Pinvoke 層果然主動觸發了 GC,成功將 Program.Alloc 這個非托管方法捉jian在床。

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

2023-07-24 10:54:58

CLR優化空間

2023-11-01 08:07:42

.NETC#

2009-08-19 10:25:18

C#托管資源

2009-09-02 16:02:52

C#引用托管對象

2009-09-02 10:39:00

C#釋放托管資源

2009-08-28 16:43:08

AutoCAD托管C#

2016-12-02 16:09:52

數據中心災難恢復

2014-01-22 09:54:09

網絡布線數據中心

2010-09-29 14:21:22

2011-05-18 18:05:47

C#C++

2011-05-18 17:56:38

C#C++

2009-08-17 13:49:20

C#中調用Window

2023-01-03 11:22:23

C#代碼SQL Server

2010-06-11 17:13:34

MySQL表索引

2009-08-27 13:27:50

C# this保留字

2009-09-01 09:16:57

C#使用SharpZi

2009-08-26 10:34:59

C# Hashtabl

2009-08-06 10:35:27

C# lock thi

2009-08-26 16:46:06

C# ThreadSt

2009-08-19 11:21:02

C# ListBox控
點贊
收藏

51CTO技術棧公眾號

91午夜精品| a毛片在线看免费观看| 亚洲欧美视频| 中文字幕v亚洲ⅴv天堂| 亚洲精品手机在线观看| 婷婷色在线资源| 久久久久久久国产精品影院| 国产美女主播一区| 精品无码久久久久| 久久av免费看| 日韩精品中文字幕在线一区| 国产免费观看高清视频| 成人动漫在线播放| 粉嫩绯色av一区二区在线观看| 2020国产精品视频| 亚洲激情图片网| 136导航精品福利| 在线视频亚洲一区| 久草视频这里只有精品| a视频网址在线观看| 国产成人精品网址| 国产精品私拍pans大尺度在线| 精品少妇久久久| 青青草97国产精品麻豆| 亚洲成年人在线播放| 黄色三级视频在线| 精精国产xxxx视频在线播放| 日韩一区欧美小说| 欧美日韩亚洲一区二区三区在线观看 | www.99久久热国产日韩欧美.com| 制服丝袜在线第一页| 国产一区二区三区四区五区3d| 亚洲aⅴ怡春院| 日韩精品福利片午夜免费观看| 久草福利在线视频| www.在线成人| 成人美女av在线直播| 日本久久综合网| 欧美日韩国产免费观看 | 欧美黄色激情视频| 国产一区二区在线视频你懂的| 欧美精品色综合| 国模杨依粉嫩蝴蝶150p| 黄色软件视频在线观看| 亚洲精品免费一二三区| 一区二区三区我不卡| 国产中文字幕在线观看| 久久综合久久综合久久综合| 国产精品二区二区三区| 99国产精品欲| 精品一二三四区| 国产精品久久久久久久久久| 国产视频91在线| 亚洲国产国产亚洲一二三| 欧美成人黑人xx视频免费观看| 性少妇xx生活| 欧美独立站高清久久| 亚洲三级免费看| a级大片在线观看| 色婷婷久久久| 日韩激情视频在线| 国产精品无码网站| 日韩大片在线免费观看| 日韩成人免费视频| 日韩片在线观看| 亚洲国产网址| 亚洲香蕉在线观看| 亚洲国产日韩一区无码精品久久久| 欧美xxxx在线| 国产亚洲欧洲高清一区| 国产真实乱人偷精品人妻| 国产一区二区三区探花| 国产亚洲精品激情久久| 亚洲一区 欧美| 四虎成人精品永久免费av九九| 中文字幕日韩精品在线| 美国黄色片视频| 欧美福利影院| 88xx成人精品| 成人公开免费视频| 日本少妇一区二区| 亚洲最大福利网站| 手机在线观看免费av| 91丨九色丨蝌蚪丨老版| 色播五月综合| 国产在线观看a| 亚洲国产视频一区二区| 青青视频在线播放| 成人国产激情| 精品日韩一区二区| 无码人妻精品一区二区三应用大全| 九九热爱视频精品视频| www.亚洲天堂| www.毛片.com| 精品一区二区免费看| 97夜夜澡人人双人人人喊| 少妇一区二区三区四区| 国产精品网友自拍| 久久99久久99精品| 国产精品久久久久av电视剧| 91精品国产色综合久久不卡蜜臀| 无码精品一区二区三区在线播放| 青青草综合网| 97超级碰碰碰久久久| 一级黄色片在线观看| 波多野结衣在线一区| 亚洲va久久久噜噜噜久久狠狠| 羞羞网站在线看| 欧美午夜www高清视频| 伊人国产精品视频| 亚洲精品无吗| 欧美激情欧美激情| 中文在线观看免费高清| av亚洲精华国产精华| 中文字幕一区二区三区四区五区六区 | 国产精品又粗又长| 日韩城人网站| 亚洲欧美中文另类| 精品视频久久久久| 国产一区二区91| 日韩欧美在线观看强乱免费| eeuss鲁一区二区三区| 欧美美女一区二区| 91视频在线网站| 在线欧美亚洲| 亚洲一区二区在线| 3p视频在线观看| 色综合久久综合网欧美综合网 | 日韩在线播放一区| 在线观看日本视频| av网站免费线看精品| 日本一级淫片演员| 成人精品国产亚洲| 亚洲欧美日韩国产成人| 欧美bbbbbbbbbbbb精品| 粉嫩一区二区三区性色av| 椎名由奈jux491在线播放| 久久久久久久| 日韩av综合网站| 精品少妇爆乳无码av无码专区| 国产在线精品一区二区夜色| 成人羞羞在线观看网站| 久久精品电影一区二区| 波多野结衣电车| 久久综合色婷婷| 少妇av一区二区三区无码| 亚洲一区二区三区日本久久九| 少妇高潮久久77777| 丰满人妻一区二区三区四区| 久久伊人中文字幕| 国产成人亚洲精品无码h在线| 久久久免费毛片| 久久久噜久噜久久综合| 亚洲精品久久久蜜桃动漫| 亚洲精品成a人| 四虎成人在线播放| 欧美黄污视频| av一区观看| 污污的网站在线看| 欧美成人女星排名| 日韩精品――中文字幕| 99麻豆久久久国产精品免费| 黄色一级片在线看| 蜜桃一区av| 国产a∨精品一区二区三区不卡| 日韩av免费观影| 欧美亚洲国产一区在线观看网站| 谁有免费的黄色网址| 麻豆专区一区二区三区四区五区| 一区二区三区四区五区精品 | 欧美午夜在线视频| 国产精品乱码| 国产网红女主播精品视频| 亚洲高清免费观看高清完整版| 日韩高清精品免费观看| 久久伊99综合婷婷久久伊| 在线免费观看av的网站| 91精品国产福利在线观看麻豆| 成人精品一二区| 涩涩视频在线播放| 国产一区二区三区日韩欧美| 一级片视频网站| 亚洲在线一区二区三区| 欧美bbbbb性bbbbb视频| 日本成人在线视频网站| 色一情一乱一乱一区91| 噜噜噜狠狠夜夜躁精品仙踪林| 日本韩国欧美精品大片卡二| 91高清在线| 精品国产欧美一区二区| av资源免费观看| 欧美高清在线一区| 免费看三级黄色片| 香蕉av777xxx色综合一区| 视频一区亚洲| 亚洲国产精品免费视频| 人九九综合九九宗合| 黄色的网站在线观看| 亚洲国产精品国自产拍av秋霞 | 久久久夜夜夜| 国产又粗又大又爽的视频| 亚洲理论电影片| 亚洲va久久久噜噜噜久久天堂| 欧美aaaaa性bbbbb小妇| 日韩在线观看免费高清完整版| 天堂在线视频网站| 欧美放荡的少妇| 性色av免费观看| 亚洲综合无码一区二区| 卡一卡二卡三在线观看| www.欧美亚洲| 亚洲国产日韩在线一区| 日韩国产欧美在线观看| 亚洲色欲久久久综合网东京热| 成人短片线上看| 国产视频一区二区不卡| 欧美黄色网络| 国产成人久久久精品一区| 高潮毛片在线观看| 中文国产亚洲喷潮| 日本国产在线| 日韩视频免费直播| 一区二区三区精| 在线精品国精品国产尤物884a| 国产无遮挡免费视频| 亚洲素人一区二区| 欧美精品日韩在线| 国产校园另类小说区| 亚洲视频 中文字幕| 国产一区二区在线免费观看| 天天操天天爱天天爽| 国产精品资源| 亚洲 高清 成人 动漫| 狠狠综合久久| 中文字幕在线观看一区二区三区| 欧美丝袜激情| 日韩国产在线一区| 九九视频精品全部免费播放| 国产一区二区三区免费不卡| 亚洲国产中文在线| a级国产乱理论片在线观看99| 91久久青草| 91视频免费在线| 成人免费91| 成人久久18免费网站图片| 99久久精品一区二区成人| 国产成人jvid在线播放| 中文字幕不卡三区视频| 668精品在线视频| heyzo高清中文字幕在线| 欧美黑人极品猛少妇色xxxxx| 四虎影院观看视频在线观看 | 秋霞午夜鲁丝一区二区老狼| 北条麻妃69av| 亚洲制服av| 99草草国产熟女视频在线| 亚洲欧美卡通另类91av| av黄色在线网站| 六月丁香综合| 别急慢慢来1978如如2| 视频在线在亚洲| 国产精品久久久毛片| 美女一区二区视频| 日韩在线一区视频| 国产乱淫av一区二区三区| 91欧美一区二区三区| 国产久卡久卡久卡久卡视频精品| 四川一级毛毛片| 成人免费观看男女羞羞视频| 三级男人添奶爽爽爽视频| 久久综合九色综合欧美就去吻| 国产特黄级aaaaa片免| 中文字幕av一区 二区| 在线观看亚洲大片短视频| 亚洲欧洲日产国码二区| 久久久综合久久| 欧美性xxxxx极品娇小| 九九热最新视频| 日韩一级片在线观看| 欧美性受xxxx狂喷水| 亚洲视频在线看| а√中文在线8| 91国产精品91| 99亚洲伊人久久精品影院| 国产精品v日韩精品| 国产精品成人3p一区二区三区 | 国产女同无遮挡互慰高潮91| 国产一区二区免费看| 亚洲av无码一区二区三区观看| 国产精品久久久久婷婷| 久久国产在线视频| 91福利在线免费观看| 国产孕妇孕交大片孕| 亚洲国产又黄又爽女人高潮的| 国产大片在线免费观看| 欧美人与物videos| 日韩一区二区三区在线免费观看 | 欧美极品xxxx| 精品国模一区二区三区| av成人免费观看| 欧美日韩激情| 2018中文字幕第一页| 日本va欧美va欧美va精品| 亚洲av无码专区在线播放中文| 国产人久久人人人人爽| 久久久久黄色片| 欧美精选在线播放| 日韩一二三四| 欧美激情久久久久久| 色噜噜成人av在线| 国产一区免费在线| 欧美激情国产在线| 久久久久久久激情| 成人在线一区二区三区| 亚洲熟女少妇一区二区| 欧美午夜视频在线观看| 性猛交xxxx乱大交孕妇印度| 夜夜嗨av色一区二区不卡| av电影免费在线看| 91久久精品国产91久久性色tv| 欧美日韩一二三四| 欧美日韩在线中文| 成人禁用看黄a在线| 国产suv精品一区二区68| 在线看国产日韩| 天堂a√在线| 午夜精品一区二区三区在线| 成人51免费| 亚洲自拍偷拍二区| 日韩经典中文字幕一区| 少妇一级淫免费观看| 亚洲综合一区二区三区| 国产xxxx在线观看| 免费91在线视频| av一级久久| 免费观看黄色大片| 久久精品国产99国产| www久久久久久久| 在线视频国产一区| 高清中文字幕一区二区三区| 国产91精品久久久久| 欧洲亚洲一区二区三区| 男人的天堂狠狠干| 成人av午夜电影| 豆国产97在线 | 亚洲| 日韩欧美一级二级三级| a免费在线观看| 岛国视频一区免费观看| 亚洲视频一区| 免费a v网站| 精品久久久久久久久久久| 五月婷婷久久久| 日本sm极度另类视频| 久久不见久久见中文字幕免费| 久久婷婷国产精品| 欧美激情资源网| 在线不卡免费视频| 久久久国产成人精品| 亚洲国产一区二区久久| 国产日韩第一页| 国产麻豆9l精品三级站| 久久精品第一页| 亚洲国产精品福利| 日本高清不卡一区二区三区视频| 欧美一区二区在线| 日本午夜一本久久久综合| 国产又粗又猛又爽又黄的视频四季| 在线播放中文一区| 色a资源在线| 久久人人97超碰人人澡爱香蕉| 蘑菇福利视频一区播放| 成人小视频免费看| 91精品国产麻豆国产自产在线 | 国产精品久久久久久超碰| 久久精品国产大片免费观看| 自拍一级黄色片| 亚洲一区在线观看免费| 四虎国产精品永远| 国产欧美日韩精品丝袜高跟鞋| 欧美在线高清| a天堂视频在线观看| 在线看国产一区二区| 在线中文字幕视频观看| 好吊色欧美一区二区三区视频 | 亚洲欧美日韩网站| 午夜视频在线观看一区| 成人亚洲综合天堂| 3d精品h动漫啪啪一区二区| 影音先锋中文字幕一区| 一级片手机在线观看| 欧美一级片在线看| 亚洲人成在线网站| 一区二区三区一级片| 成年人国产精品| 国产孕妇孕交大片孕| 91av在线网站| 中文字幕日韩一区二区不卡| 北岛玲一区二区| 日韩欧美黄色影院| 日本一区免费网站|