日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

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

來源: 責(zé)編: 時間:2024-06-12 17:31:31 233觀看
導(dǎo)讀一、背景1. 講故事年前遇到了好幾例托管堆被損壞的案例,有些運氣好一些,從被破壞的托管堆內(nèi)存現(xiàn)場能觀測出大概是什么問題,但更多的情況下是無法做出準(zhǔn)確判斷的,原因就在于生成的dump是第二現(xiàn)場,借用之前文章的一張圖,大家

一、背景

1. 講故事

年前遇到了好幾例托管堆被損壞的案例,有些運氣好一些,從被破壞的托管堆內(nèi)存現(xiàn)場能觀測出大概是什么問題,但更多的情況下是無法做出準(zhǔn)確判斷的,原因就在于生成的dump是第二現(xiàn)場,借用之前文章的一張圖,大家可以理解一下。jkg28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片jkg28資訊網(wǎng)——每日最新資訊28at.com

為了幫助更多受此問題困擾的朋友,這篇來整理一下如何 快狠準(zhǔn) 的抓取第一現(xiàn)場。jkg28資訊網(wǎng)——每日最新資訊28at.com

二、抓取第一現(xiàn)場

1. 思路分析

要想抓到第一現(xiàn)場,只需要讓破壞托管堆的那個線程在修改完之后,回到 CLR Pinvoke 層的時候主動觸發(fā)GC,因為這時候托管堆已經(jīng)是損壞狀態(tài)了,程序也就會立即崩潰,破壞線程也就被捉j(luò)ian在床,畫個圖如下:jkg28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片jkg28資訊網(wǎng)——每日最新資訊28at.com

那如何讓 CLR:PInvoke 主動觸發(fā)GC呢?這就需要借助微軟的 MDA 托管調(diào)試助手,它有一個 gcUnmanagedToManaged 配置項就是專門做這件事情的,參考網(wǎng)址:https://learn.microsoft.com/zh-cn/dotnet/framework/debug-trace-profile/gcunmanagedtomanaged-mdajkg28資訊網(wǎng)——每日最新資訊28at.com

2. 如何配置 MDA

MDA 的配置非常簡單,大體上分兩步:jkg28資訊網(wǎng)——每日最新資訊28at.com

  1. 提交注冊表開啟MDA

這里使用注冊表的方式,需要注意的是,程序和操作系統(tǒng)位數(shù)一致的話采用如下方式。jkg28資訊網(wǎng)——每日最新資訊28at.com

Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework]"MDA"="1"

如果不一致,采用如下配置,比如 32bit 程序跑在 64bit 系統(tǒng)上。jkg28資訊網(wǎng)——每日最新資訊28at.com

Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/.NETFramework]"MDA"="1"

這里我用的是第二段內(nèi)容,按照官方文檔描述,將內(nèi)容保存到 MDAEnable.reg 中,然后在 注冊表編輯器 上導(dǎo)入即可。jkg28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片jkg28資訊網(wǎng)——每日最新資訊28at.com

開啟應(yīng)用程序級捕獲

為了能夠讓 gcUnmanagedToManaged 生效,需要新建應(yīng)用程序打頭的配置文件,比如:Example_16_1_2.exe.mda.config,內(nèi)容如下:jkg28資訊網(wǎng)——每日最新資訊28at.com

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

完整截圖:jkg28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片jkg28資訊網(wǎng)——每日最新資訊28at.com

這樣就算配置好了,當(dāng)程序在 PInvoke 時,CLR 會讀取注冊表的 MDA 值,如果開啟的話就會讀取 config 中 gcUnmanagedToManaged 子節(jié)做相應(yīng)的邏輯。jkg28資訊網(wǎng)——每日最新資訊28at.com

tips:如果配置不生效,保守一點的話,建議重啟下機(jī)器。jkg28資訊網(wǎng)——每日最新資訊28at.com

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

為了演示托管堆損壞,我準(zhǔn)備將一個 string 傳給 C++,然后讓 C++ 溢出它來實現(xiàn)托管堆破壞。jkg28資訊網(wǎng)——每日最新資訊28at.com

C# 代碼如下:jkg28資訊網(wǎng)——每日最新資訊28at.com

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++ 代碼如下:jkg28資訊網(wǎng)——每日最新資訊28at.com

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) 的線程棧上觸發(fā)了 GC 就是第一現(xiàn)場,Task 下的 GC.Collect(); 是第二現(xiàn)場,如果是前者目的就達(dá)到了。jkg28資訊網(wǎng)——每日最新資訊28at.com

激動人心的時刻到了,把程序跑起來后,由于程序崩潰,procdump 立即給我抓了一個 crash dump,截圖如下:jkg28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片jkg28資訊網(wǎng)——每日最新資訊28at.com

接下來打開 windbg,從序幕信息看果然是 GC 清掃的時候出的問題,托管堆也是損壞狀態(tài),信息如下:jkg28資訊網(wǎng)——每日最新資訊28at.com

Debug session time: Sun Jan 29 10:14:21.000 2023 (UTC + 8:00)System Uptime: 0 days 1:14:11.423Process 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 -veax=00610060 ebx=00000000 ecx=02da23a4 edx=00000001 esi=02da2370 edi=02da2388eip=79a6f2d1 esp=00d3ef64 ebp=00d3f104 iopl=0         nv up ei pl nz na pe nccs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010206clr!WKS::gc_heap::plan_phase+0x79b:79a6f2d1 f70000000080    test    dword ptr [eax],80000000h ds:002b:00610060=????????0:000> !VerifyHeapCould not request method table data for object 02DA1228 (MethodTable: 0000000C).Last good object: 02DA121C.object 03da1020: bad member 02DA1228 at 03DA1098Last good object: 03DA1010.object 03da2338: bad member 02DA1228 at 03DA2340Last good object: 03DA2328.object 03da3568: bad member 02DA2364 at 03DA357CLast good object: 03DA3558.Failed to request SyncBlk at index 1.

那是不是主線程引發(fā)的GC呢?切過去便知。jkg28資訊網(wǎng)——每日最新資訊28at.com

0:000> ~0seax=00610060 ebx=00000000 ecx=02da23a4 edx=00000001 esi=02da2370 edi=02da2388eip=79a6f2d1 esp=00d3ef64 ebp=00d3f104 iopl=0         nv up ei pl nz na pe nccs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010206clr!WKS::gc_heap::plan_phase+0x79b:79a6f2d1 f70000000080    test    dword ptr [eax],80000000h ds:002b:00610060=????????0:000> !clrstackOS Thread Id: 0x52ac (0)Child SP       IP Call Site00d3f220 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+0x79b01 00d3f124 79a6847b     clr!WKS::gc_heap::gc1+0xbc02 00d3f13c 79a68585     clr!WKS::gc_heap::garbage_collect+0x36703 00d3f15c 79b1ddbd     clr!WKS::GCHeap::GarbageCollectGeneration+0x1bd04 00d3f16c 79b1de34     clr!WKS::GCHeap::GarbageCollectTry+0x7105 00d3f198 79d20aed     clr!WKS::GCHeap::GarbageCollect+0xac06 00d3f204 79d066c0     clr!TriggerGCForMDAInternal+0x7d07 00d3f28c 02bc0aa7     clr!StubHelpers::TriggerGCForMDA+0x61WARNING: Frame IP not in any known module. Following frames may be wrong.08 00d3f2d8 02bc09c9     0x2bc0aa709 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+0x340c 00d3f378 7997859b     clr!CallDescrWorkerWithHandler+0x6b0d 00d3f3ec 79b1b11b     clr!MethodDescCallSite::CallTargetWorker+0x16a0e 00d3f510 79b1b7fa     clr!RunMain+0x1b30f 00d3f77c 79b1b727     clr!Assembly::ExecuteMainMethod+0xf7

從線程棧上的 clr!StubHelpers::TriggerGCForMDA 來看,在 Pinvoke 層果然主動觸發(fā)了 GC,成功將 Program.Alloc 這個非托管方法捉j(luò)ian在床。jkg28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-93367-0.htmlC#托管堆遭破壞問題溯源分析

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: PHP二進(jìn)制 Swoole-Cli 了解一下

下一篇: Go 面試中的隱藏陷阱:SliceHeader 問題解析

標(biāo)簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
农夫在线精品视频免费观看| 性亚洲最疯狂xxxx高清| 国内精品福利| 欧美日韩精品久久久| 狠狠综合久久| 欧美在线观看视频一区二区| 欧美新色视频| 国内精品久久久久久久果冻传媒| 亚洲欧洲在线播放| 亚洲资源av| 欧美暴力喷水在线| 国产精品午夜在线| 亚洲国产精品免费| 亚洲视频免费在线观看| 久久亚洲一区二区| 欧美天堂在线观看| 亚洲第一精品夜夜躁人人爽 | 国产精品黄页免费高清在线观看| 国产精品福利在线观看网址| 伊人成年综合电影网| 亚洲综合色在线| 欧美.www| 国产欧美一区二区三区久久| 亚洲毛片在线看| 久久蜜桃精品| 国产欧美精品xxxx另类| 日韩午夜激情av| 噜噜噜噜噜久久久久久91| 国产精品免费观看视频| 亚洲精品护士| 久久久久在线观看| 国产喷白浆一区二区三区| 日韩视频不卡中文| 玖玖在线精品| 激情成人在线视频| 欧美诱惑福利视频| 国产精品网曝门| 一区二区高清在线观看| 欧美成人精品一区| 亚洲成人原创| 久久免费国产| 亚洲国产精品综合| 欧美成熟视频| 亚洲特级片在线| 国产精品网站在线观看| 欧美专区18| 亚洲高清电影| 久久久最新网址| 亚洲国产综合视频在线观看| 美女精品一区| 一本到高清视频免费精品| 国产精品国产自产拍高清av王其| 亚洲一区二区精品视频| 亚洲网站在线播放| 中文国产亚洲喷潮| 国产日韩av在线播放| 久久久国产一区二区三区| 在线看欧美视频| 欧美日韩国产在线看| 午夜精品成人在线| 亚洲国产高清aⅴ视频| 欧美少妇一区| 久久久噜噜噜久久人人看| 亚洲国产精品免费| 国产精品视频第一区| 久久久久久国产精品一区| 亚洲精品乱码久久久久久| 国产精品国产a级| 久久精品视频免费观看| 99re这里只有精品6| 国产婷婷色一区二区三区在线 | 欧美成人精品不卡视频在线观看| 99视频精品免费观看| 国产日韩成人精品| 欧美va天堂在线| 午夜日韩电影| 亚洲精品国产精品乱码不99| 国产精品少妇自拍| 欧美高清视频一区二区| 欧美一区二区黄色| 夜夜嗨av一区二区三区四区| 国产一区二区三区久久悠悠色av| 欧美激情一区二区三区四区| 欧美在线观看天堂一区二区三区| 亚洲免费大片| 亚洲二区精品| 国产一区二区精品久久99| 欧美日韩一区二区在线观看| 狂野欧美一区| 久久久久成人精品| 亚洲欧美视频在线观看| 日韩一区二区免费高清| 亚洲福利视频二区| 狠狠色综合网| 国一区二区在线观看| 国产日韩在线亚洲字幕中文| 欧美性一二三区| 欧美午夜精品久久久久久孕妇 | 亚洲片区在线| 亚洲精品免费电影| 亚洲人成人77777线观看| 亚洲福利精品| 亚洲国产精品久久久久久女王| 在线精品视频在线观看高清| 黑人巨大精品欧美一区二区| 精久久久久久| 亚洲高清在线精品| 最新日韩中文字幕| 亚洲美女网站| 亚洲影院在线| 欧美在线免费一级片| 久久久久久久国产| 欧美国产日韩视频| 欧美视频四区| 国产午夜精品一区二区三区视频| 午夜精彩视频在线观看不卡| 亚洲图片你懂的| 午夜精品久久久久久久99黑人| 欧美在线视频a| 免费亚洲电影| 国产精品美女主播| 韩国精品久久久999| 亚洲欧洲三级| 亚洲永久视频| 噜噜噜噜噜久久久久久91 | 91久久精品国产91性色tv| 99热在这里有精品免费| 亚洲女性喷水在线观看一区| 久久久久久欧美| 欧美喷水视频| 国产综合av| 一本一本久久a久久精品牛牛影视| 亚洲欧美影院| 欧美国产日韩在线| 国产一二精品视频| 99精品视频免费| 久久夜精品va视频免费观看| 欧美视频在线观看 亚洲欧| 黄色日韩在线| 亚洲男人影院| 欧美老女人xx| 一区二区亚洲欧洲国产日韩| 亚洲亚洲精品在线观看| 欧美成人国产一区二区| 国产一区二区三区在线观看免费视频 | 激情综合视频| 香港久久久电影| 欧美日韩在线第一页| 亚洲经典三级| 快射av在线播放一区| 国精品一区二区| 久久www成人_看片免费不卡| 国产精品盗摄久久久| 亚洲黄色性网站| 免费久久99精品国产自在现线| 国产精品网站在线| 亚洲一区二区在线播放| 欧美日韩大片| 一区二区高清| 欧美深夜福利| 亚洲一区999| 国产精品视区| 久久gogo国模裸体人体| 国产日韩欧美在线播放| 欧美在线视频一区二区三区| 国产美女精品视频免费观看| 欧美一级淫片播放口| 国产亚洲永久域名| 久久久久国产精品一区三寸| 激情五月***国产精品| 久久手机免费观看| 亚洲国产精品成人综合色在线婷婷 | 欧美一级专区| 国产视频不卡| 另类亚洲自拍| 一区二区动漫| 国产亚洲成av人片在线观看桃| 久久精品国产视频| 亚洲欧洲三级| 国产精品v亚洲精品v日韩精品| 亚洲女女女同性video| 黑人一区二区| 欧美日本二区| 午夜精品久久久久久久男人的天堂| 国产精品日韩专区| 开元免费观看欧美电视剧网站| 亚洲人成77777在线观看网| 国产精品久久一区主播| 久久久99免费视频| 日韩一级片网址| 韩国av一区二区三区四区| 欧美高清视频在线| 午夜欧美精品久久久久久久| 在线观看亚洲精品| 国产精品久久久久久久久借妻| 久久激情五月丁香伊人| 日韩视频二区| 在线看片成人| 国产视频久久久久| 欧美日韩一区二区高清| 蜜桃av一区二区三区| 亚洲男人的天堂在线| 日韩午夜黄色| 亚洲福利国产|