国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)

這篇具有很好參考價(jià)值的文章主要介紹了Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、簡(jiǎn)介
     今天是《Net 高級(jí)調(diào)試》的第六篇文章。記得我剛接觸 Net 框架的時(shí)候,還是挺有信心的,對(duì)所謂的值類型和引用類型也能說(shuō)出自己的見(jiàn)解,畢竟,自己一直在努力。當(dāng)然這些見(jiàn)解都是書(shū)本上的,并沒(méi)有做到眼見(jiàn)為實(shí),所以總是有些東西說(shuō)不清楚。今天,我們就好好的說(shuō)說(shuō) C# 的類型,是從內(nèi)存級(jí)別、從底層來(lái)說(shuō)一下值類型、引用類型到底是什么,它們?cè)趦?nèi)存中的形態(tài),還有也說(shuō)說(shuō)數(shù)組的內(nèi)存形態(tài),如何內(nèi)部布局的,以及我們?nèi)绾尾檎矣晌床蹲降漠惓R鸬某绦虮罎ⅰ_@些都是基礎(chǔ)的,如果這些掌握不好,以后的高級(jí)調(diào)試的道路,也不好走。自從我過(guò)了這一關(guān),很多東西理解起來(lái),比較透徹 了,但是,還必須努力。當(dāng)然了,第一次看視頻或者看書(shū),是很迷糊的,不知道如何操作,還是那句老話,一遍不行,那就再來(lái)一遍,還不行,那就再來(lái)一遍,俗話說(shuō)的好,書(shū)讀千遍,其意自現(xiàn)。
     如果在沒(méi)有說(shuō)明的情況下,所有代碼的測(cè)試環(huán)境都是 Net Framewok 4.8,但是,有時(shí)候?yàn)榱瞬榭丛创a,可能需要使用 Net Core 的項(xiàng)目,我會(huì)在項(xiàng)目章節(jié)里進(jìn)行說(shuō)明。好了,廢話不多說(shuō),開(kāi)始我們今天的調(diào)試工作。

    ?? 調(diào)試環(huán)境我需要進(jìn)行說(shuō)明,以防大家不清楚,具體情況我已經(jīng)羅列出來(lái)。
          操作系統(tǒng):Windows Professional 10
          調(diào)試工具:Windbg Preview(可以去Microsoft Store 去下載)
          開(kāi)發(fā)工具:Visual Studio 2022
          Net 版本:Net Framework 4.8
          CoreCLR源碼:源碼下載

二、基礎(chǔ)知識(shí)
    1、對(duì)象檢查
        1.1、簡(jiǎn)介
            高級(jí)調(diào)試的目標(biāo)就是分析應(yīng)用程序故障所形成的原因,既然是故障,大多數(shù)情況下是對(duì)象的某種損壞,這就需要我們深入的了解各種對(duì)象的審查方法。

    2、各種檢查方法
        2.1、內(nèi)存轉(zhuǎn)儲(chǔ)
              這個(gè)方式非常底層,從內(nèi)存地址上觀察地址上的內(nèi)容,常使用【dp】命令。出來(lái)【dp】命令,還有其他一些命令,比如:du,dw,db,da 等,如果想了解更多,可以查看 Windbg 的幫助文檔,命令是【.hh】。

        2.2、對(duì)值類型的轉(zhuǎn)儲(chǔ)
              對(duì)值類型的轉(zhuǎn)儲(chǔ)非常的簡(jiǎn)單,一般通過(guò)【dp】命令觀察內(nèi)存地址,從內(nèi)存上提取內(nèi)容,可以在結(jié)束處觀察 esp 指針,當(dāng)然,如果知道棧地址,我們也可以使用【dp】命令查看內(nèi)容,效果和查看 esp 是一樣的。

        2.3、對(duì)應(yīng)用類型的轉(zhuǎn)儲(chǔ)
              如果我們想查看引用類型的內(nèi)容,我們可以使用【!do】命令,查看應(yīng)用類型的內(nèi)容。

        2.4、對(duì)數(shù)組的轉(zhuǎn)儲(chǔ)
              C# 數(shù)組的內(nèi)存布局,大概有兩種形式,值類型和引用類型。
              1)值類型數(shù)組。
                  結(jié)構(gòu):同步塊索引,方法表,數(shù)組大小,數(shù)組元素1,數(shù)組元素2......

              2)引用類型數(shù)組。
                  結(jié)構(gòu):同步塊索引,方法表,數(shù)組大小,數(shù)組元素1,數(shù)組元素2......
                                      |      |
                               |------------------+      +--------------------|
                               |                    ?? |
                         ?? 同步塊索引、方法表、內(nèi)容        同步塊索引、方法表、內(nèi)容

        2.5、對(duì)異常的轉(zhuǎn)儲(chǔ)
              有時(shí)候,程序存在未處理的異常導(dǎo)致的崩潰,在事后分析 dump 中要是能找到這個(gè)異常,對(duì)我們分析和解決問(wèn)題會(huì)有很大的幫助。如果我們想查看異常的詳情,我們可以使用【!pe(print exception)】命令,打印異常的詳情,當(dāng)然也可以使用【!do】命令查看更詳細(xì)的異常內(nèi)容。

三、調(diào)試過(guò)程
    廢話不多說(shuō),這一節(jié)是具體的調(diào)試操作的過(guò)程,又可以說(shuō)是眼見(jiàn)為實(shí)的過(guò)程,在開(kāi)始之前,我還是要啰嗦兩句,這一節(jié)分為兩個(gè)部分,第一部分是測(cè)試的源碼部分,沒(méi)有代碼,當(dāng)然就談不上測(cè)試了,調(diào)試必須有載體。第二部分就是根據(jù)具體的代碼來(lái)證實(shí)我們學(xué)到的知識(shí),是具體的眼見(jiàn)為實(shí)。
    1、測(cè)試源碼
        1.1、Example_6_1_1
Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)
 1 namespace Example_6_1_1
 2 {
 3     internal class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             var person = new Person();
 8 
 9             Console.ReadLine();
10         }
11     }
12 
13     internal class Person
14     {
15         public int Age = 20;
16 
17         public string Name = "jack";
18     }
19 }
View Code

        1.2、Example_6_1_2
Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)
 1 namespace Example_6_1_2
 2 {
 3     internal class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Debugger.Break();
 8 
 9             int a = 10;
10             int b = 11;
11             int c = 12;
12             int d = 13;
13         }
14     }
15 }
View Code

        1.3、Example_6_1_3
Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)
 1 namespace Example_6_1_3
 2 {
 3     internal class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             int[] intArr = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
 8 
 9             string[] stringArr = { "1", "2", "3", "4", "5" };
10 
11             Debugger.Break();
12         }
13     }
14 }
View Code

        1.4、Example_6_1_4
Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)
 1 namespace Example_6_1_4
 2 {
 3     internal class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Console.WriteLine($"請(qǐng)輸入一個(gè)能夠整除的數(shù)字:");
 8             var num = Console.ReadLine();
 9 
10             var ret = 10 / Convert.ToInt32(num);
11         }
12     }
13 }
View Code

    2、眼見(jiàn)為實(shí)
        項(xiàng)目的所有操作都是一樣的,所以就在這里說(shuō)明一下,但是每個(gè)測(cè)試?yán)?,都需要重新啟?dòng),并加載相應(yīng)的應(yīng)用程序,加載方法都是一樣的。流程如下我們編譯項(xiàng)目,打開(kāi) Windbg,點(diǎn)擊【文件】----》【launch executable】附加程序,打開(kāi)調(diào)試器的界面,程序已經(jīng)處于中斷狀態(tài)。我們需要使用【g】命令,繼續(xù)運(yùn)行程序,然后到達(dá)指定地點(diǎn)停止后,我們可以點(diǎn)擊【break】按鈕,就可以調(diào)試程序了。有時(shí)候可能需要切換到主線程,可以使用【~0s】命令。

        2.1、內(nèi)存轉(zhuǎn)儲(chǔ)
            測(cè)試代碼:Example_6_1_1
            我們首先去托管堆中查找一下 Person 對(duì)象?!綿p】命令的 p 是 pointer,指針的意思。
1 0:006> !dumpheap -type Person
2  Address       MT     Size
3 031424c8 013d4dec       16     
4 
5 Statistics:
6       MT    Count    TotalSize Class Name
7 013d4dec        1           16 Example_6_1_1.Person
8 Total 1 objects

            031424c8(Person 對(duì)象的指針地址) 013d4dec(Person 方法表的地址)

 1 0:006> !dumpobj /d 031424c8
 2 Name:        Example_6_1_1.Person
 3 MethodTable: 013d4dec
 4 EEClass:     013d12f0
 5 Size:        16(0x10) bytes
 6 File:        E:\Visual Studio 2022\Source\Projects\....\Example_6_1_1\bin\Debug\Example_6_1_1.exe
 7 Fields:
 8       MT    Field   Offset                 Type VT     Attr    Value Name
 9 706342a8  4000001        8         System.Int32  1 instance       20 Age
10 706324e4  4000002        4        System.String  0 instance 031424d8 Name

?

            上面兩段代碼,紅色標(biāo)注的就是 Person 對(duì)象的方法表的地址,他們是一樣的。我們有了對(duì)象的地址,對(duì)象的地址其實(shí)就是類型句柄的地址,也就是知道通過(guò)快索引的地址,只要減去 0x4就可以,說(shuō)明一下,每個(gè)引用類型都包含【同步塊索引】和【類型句柄】。

?

1 0:006> dp 031424c8-0x4 l4
2 031424c4  00000000 013d4dec 031424d8 00000014

?

             00000000 就是同步塊索引,后面的?013d4dec 就是方法表的地址,最后兩項(xiàng)就是 Person 具體的值。00000014 就是十進(jìn)制的20,也就是 Person 對(duì)象的 Age 字段的值。031424d8 就是 Person 對(duì)象的 Name 的值。我們來(lái)驗(yàn)證。

 1 0:006> !do 031424d8
 2 Name:        System.String
 3 MethodTable: 706324e4
 4 EEClass:     70737690
 5 Size:        22(0x16) bytes
 6 File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 7 String:      jack
 8 Fields:
 9       MT    Field   Offset                 Type VT     Attr    Value Name
10 706342a8  4000283        4         System.Int32  1 instance        4 m_stringLength
11 70632c9c  4000284        8          System.Char  1 instance       6a m_firstChar
12 706324e4  4000288       70        System.String  0   shared   static Empty
13     >> Domain:Value  01472260:NotInit  <<
14 
15 
16 0:006> ? 00000014
17 Evaluate expression: 20 = 00000014

              紅色標(biāo)注的就是具體的值。我們可以繼續(xù)使用【dp】命令,查看 name 的詳情。

1 0:006> dp 031424d8 l4
2 031424d8  706324e4 00000004 0061006a 006b0063

              031424d8(字符串 Name 的地址) 706324e4(name 的方法表的地址) 00000004(字符串的長(zhǎng)度) 0061006a 006b0063(這兩項(xiàng)就是具體的值),字符串的長(zhǎng)度,我們可以通過(guò) name 的地址加上 0x4,就可以得到字符串的長(zhǎng)度。

1 0:006> dp 031424d8+0x4 l4
2 031424dc  00000004 0061006a 006b0063 00000000

?

              為什么是加上 0x4,因?yàn)槲覀冊(cè)谑褂谩?do】命令,查看 name 詳情的時(shí)候,m_stringLength 的偏移量是4。??????
              Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)

              0061006a(看地址,我們是從低地址往高地址看),所以我們先看 006a,然后再查看 0061,006b0063這個(gè)地址也是一樣的。我們可以使用【du】命令查看它的內(nèi)容,u就是 Unicode。006a 就是 j,0061就是a,0063就是 c,006b就是k。

1 0:006> du 031424d8+0x8
2 031424e0  "jack"

              為什么加 0x8,因?yàn)槠屏渴?。


        2.2、對(duì)值類型的轉(zhuǎn)儲(chǔ)。
            測(cè)試代碼:Example_6_1_2
            我們首先找到棧地址,可以使用【!clrstack】命令,有了棧地址,我們可以使用【bp】命令在該地址上設(shè)置斷點(diǎn)。
1 0:000> !clrstack 
2 OS Thread Id: 0x358c (0)
3 Child SP       IP Call Site
4 007af2e0 7566f262 [HelperMethodFrame: 007af2e0] System.Diagnostics.Debugger.BreakInternal()
5 007af35c 7146f195 System.Diagnostics.Debugger.Break() [f:\dd\ndp\clr\src\BCL\system\diagnostics\debugger.cs @ 91]
6 007af384 029e0879 Example_6_1_2.Program.Main(System.String[]) [E:\Visual Studio 2022\Source\Projects\...\Example_6_1_2\Program.cs @ 9]
7 007af504 71daf036 [GCFrame: 007af504] 

            紅色標(biāo)注的【029e0879】就是【Program.Main】方法的棧地址,然后我們?cè)O(shè)置斷點(diǎn),【g】繼續(xù)運(yùn)行。

1 0:000> bp 029e0879
2 0:000> g
3 Breakpoint 0 hit
4 eax=00000000 ebx=007af434 ecx=72227ced edx=00b239b0 esi=00000000 edi=007af3b0
5 eip=029e0879 esp=007af384 ebp=007af398 iopl=0         nv up ei pl zr na pe nc
6 cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
7 Example_6_1_2!COM+_Entry_Point <PERF> (Example_6_1_2+0x23d0879):
8 029e0879 90              nop

            在斷點(diǎn)處暫停,如圖:
            Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)

            然后,使用【g】命令,繼續(xù)運(yùn)行。

1 0:000> g
2 Breakpoint 1 hit
3 eax=00000000 ebx=007af434 ecx=72227ced edx=00b239b0 esi=00000000 edi=007af3b0
4 eip=029e0896 esp=007af384 ebp=007af398 iopl=0         nv up ei pl zr na pe nc
5 cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
6 Example_6_1_2!COM+_Entry_Point <PERF> (Example_6_1_2+0x23d0896):
7 029e0896 90              nop

            然后,我們使用【dp esp】命令查看詳細(xì),當(dāng)然我們可以可以使用【dp 007af384】,dp 命令后跟的是棧地址,都是可以的。

1 0:000> dp esp
2 007af384  0000000d 0000000c 0000000b 0000000a
3 007af394  02a024bc 007af3a4 71daf036 00b239b0
4 007af3a4  007af3f8 71db22da 007af434 007af3e8
5 007af3b4  71ea23d0 007af504 71db2284 b7ed3afc
6 007af3c4  007af544 007af4c8 007af47c 71dbec59
7 007af3d4  007af434 00000000 b7ed3afc 007af3b0
8 007af3e4  007af4c8 007af574 71ea09b0 c64cea1c
9 007af3f4  00000001 007af460 71db859b 00000000

            紅色標(biāo)注的就是變量賦的值。匯編代碼如下:

            Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)

            當(dāng)然,我們也可以通過(guò)【!clrstack -l】命令也可以找到所有局部變量。
 1 0:000> !clrstack -l
 2 OS Thread Id: 0x358c (0)
 3 Child SP       IP Call Site
 4 007af384 029e0896 Example_6_1_2.Program.Main(System.String[]) [E:\Visual Studio 2022\...\Example_6_1_2\Program.cs @ 15]
 5     LOCALS:
 6         0x007af390 = 0x0000000a(a 變量的值,等號(hào)前面是棧地址)
 7         0x007af38c = 0x0000000b(a 變量的值,等號(hào)前面是棧地址,等不 a 的棧地址減去 0x4)
 8         0x007af388 = 0x0000000c(a 變量的值,等號(hào)前面是棧地址,等不 b 的棧地址減去 0x4
 9         0x007af384 = 0x0000000d(a 變量的值,等號(hào)前面是棧地址,等不 c 的棧地址減去 0x4
10 
11 007af504 71daf036 [GCFrame: 007af504] 

            棧地址是由高到低分配的,0x007af384 是變量d 的地址,0x007af384+0x4=0x007af388,這個(gè)地址就是c 變量的地址,0x007af388+0x4=0x007af38c,0x007af38c這個(gè)地址就是 b 變量的地址,0x007af38c+0x4就是 a 變量的地址,也就是?0x007af390。


        2.3、對(duì)引用類型的轉(zhuǎn)儲(chǔ)。
            測(cè)試代碼:Example_6_1_1
 1 0:000> !clrstack -l
 2 OS Thread Id: 0x38fc (0)
 3 Child SP       IP Call Site
 4 00aff25c 777110fc [InlinedCallFrame: 00aff25c] 
 5 00aff258 70d99b71 DomainNeutralILStubClass.IL_STUB_PInvoke(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr)
 6 
 7 ...
 8 
 9 00aff358 0117088e Example_6_1_1.Program.Main(System.String[]) [E:\Visual Studio 2022\...\Example_6_1_1\Program.cs @ 11]
10     LOCALS:
11         0x00aff360 = 0x02bb24c8
12 
13 00aff4dc 71daf036 [GCFrame: 00aff4dc] 

            我們查看線程棧了,找到了局部變量。也找到了地址,我們通過(guò)【!do】或者【!dumpobj】查看Person 變量。

 1 0:000> !DumpObj /d 02bb24c8
 2 Name:        Example_6_1_1.Person
 3 MethodTable: 00d14dec
 4 EEClass:     00d112f0
 5 Size:        16(0x10) bytes
 6 File:        E:\Visual Studio 2022\Source\Projects\...\Example_6_1_1\bin\Debug\Example_6_1_1.exe
 7 Fields:
 8       MT    Field   Offset                 Type VT     Attr    Value Name
 9 708f42a8  4000001        8         System.Int32  1 instance       20 Age
10 708f24e4  4000002        4        System.String  0 instance 02bb24d8 Name(紅色又是一個(gè)地址)

            紅色的可以在【!do】,我們就可以看到詳情。

 1 0:000> !DumpObj /d 02bb24d8
 2 Name:        System.String
 3 MethodTable: 708f24e4
 4 EEClass:     709f7690
 5 Size:        22(0x16) bytes
 6 File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 7 String:      jack(字符串 name 變量的值)
 8 Fields:
 9       MT    Field   Offset                 Type VT     Attr    Value Name
10 708f42a8  4000283        4         System.Int32  1 instance        4 m_stringLength
11 708f2c9c  4000284        8          System.Char  1 instance       6a m_firstChar
12 708f24e4  4000288       70        System.String  0   shared   static Empty
13     >> Domain:Value  00d6d780:NotInit  <<
            說(shuō)明:我們有了對(duì)象的地址,也可以使用【dp】命令,只不過(guò)不太好看。
1 0:000> dp 02bb24c8 l4
2 02bb24c8  00d14dec 02bb24d8 00000014 80000000

            00d14dec 這個(gè)地址就是 Person 對(duì)象的方法表的地址,02bb24d8 就是name 變量的地址。00000014 就是 age 變量的值。


        2.4、對(duì)數(shù)組的轉(zhuǎn)儲(chǔ)。
            測(cè)試代碼:Example_6_1_3
           
1)值類型數(shù)組
              
我們定義的數(shù)組:int[] intArr = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
              
我們先打印出線程棧。
 1 0:000> !clrstack -l
 2 OS Thread Id: 0x2e54 (0)
 3 Child SP       IP Call Site
 4 00afeeec 7566f262 [HelperMethodFrame: 00afeeec] System.Diagnostics.Debugger.BreakInternal()
 5 00afef68 7146f195 System.Diagnostics.Debugger.Break() [f:\dd\ndp\clr\src\BCL\system\diagnostics\debugger.cs @ 91]
 6 
 7 00afef90 00ce0920 Example_6_1_3.Program.Main(System.String[]) [E:\Visual Studio 2022\...\Example_6_1_3\Program.cs @ 13]
 8     LOCALS:
 9         0x00afef9c = 0x02b82518(int 數(shù)組,值類型數(shù)組)
10         0x00afef98 = 0x02b82574(string 數(shù)組,引用類型的數(shù)組)
11 
12 00aff118 71daf036 [GCFrame: 00aff118] 

                我們可以點(diǎn)擊棧地址后面的地址,就可以查看詳情,相當(dāng)于【!do】命令。

 1 0:000> !DumpObj /d 02b82518
 2 Name:        System.Int32[]
 3 MethodTable: 708f426c
 4 EEClass:     709f805c
 5 Size:        56(0x38) bytes
 6 Array:       Rank 1, Number of elements 11, Type Int32 (Print Array)
 7 Fields:
 8 None
 9 0:000> !DumpObj /d 02b82574
10 Name:        System.String[]
11 MethodTable: 708f2d74
12 EEClass:     709f7820
13 Size:        32(0x20) bytes
14 Array:       Rank 1, Number of elements 5, Type CLASS (Print Array)
15 Fields:
16 None

                使用【dp】命令,查看結(jié)果?!               ?/p>

1 0:000> dp 0x02b82518-0x4 L20(為什么要減去 0x4,因?yàn)楫?dāng)前對(duì)象的指針指向方法表,每個(gè)域是占用4個(gè)字節(jié),L20 的l 是不區(qū)分大小寫(xiě)的)
2 02b82514  00000000 708f426c 0000000b 0000000a
3 02b82524  0000000b 0000000c 0000000d 0000000e
4 02b82534  0000000f 00000010 00000011 00000012
5 02b82544  00000013 00000014 00000000 708f4354
6 02b82554  00000000 00000000 00000000 00000000
7 02b82564  00000000 00000000 00c44dd8 00000000
8 02b82574  708f2d74 00000005 02b824c8 02b824d8
9 02b82584  02b824e8 02b824f8 02b82508 00000000

                00000000 表示的同步塊所有,為0就是什么數(shù)據(jù)都沒(méi)有,708f426c 就是方法表的地址。0000000b 表示的數(shù)組長(zhǎng)度,十進(jìn)制是11,表示有11個(gè)元素。此項(xiàng)后面的就是數(shù)組元素了。
               ?? 如果想可視化的查看,可以使用命令【!da -details】,內(nèi)容太多,折疊了。

Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)
  1 0:000> !da -details 0x02b82518
  2 Name:        System.Int32[]
  3 MethodTable: 708f426c
  4 EEClass:     709f805c
  5 Size:        56(0x38) bytes
  6 Array:       Rank 1, Number of elements 11, Type Int32
  7 Element Methodtable: 708f42a8
  8 [0] 02b82520
  9     Name:        System.Int32
 10     MethodTable: 708f42a8
 11     EEClass:     709f8014
 12     Size:        12(0xc) bytes
 13     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 14     Fields:
 15               MT    Field   Offset                 Type VT     Attr    Value Name
 16         708f42a8  40005a2        0             System.Int32      1     instance           10     m_value
 17 [1] 02b82524
 18     Name:        System.Int32
 19     MethodTable: 708f42a8
 20     EEClass:     709f8014
 21     Size:        12(0xc) bytes
 22     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 23     Fields:
 24               MT    Field   Offset                 Type VT     Attr    Value Name
 25         708f42a8  40005a2        0             System.Int32      1     instance           11     m_value
 26 [2] 02b82528
 27     Name:        System.Int32
 28     MethodTable: 708f42a8
 29     EEClass:     709f8014
 30     Size:        12(0xc) bytes
 31     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 32     Fields:
 33               MT    Field   Offset                 Type VT     Attr    Value Name
 34         708f42a8  40005a2        0             System.Int32      1     instance           12     m_value
 35 [3] 02b8252c
 36     Name:        System.Int32
 37     MethodTable: 708f42a8
 38     EEClass:     709f8014
 39     Size:        12(0xc) bytes
 40     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 41     Fields:
 42               MT    Field   Offset                 Type VT     Attr    Value Name
 43         708f42a8  40005a2        0             System.Int32      1     instance           13     m_value
 44 [4] 02b82530
 45     Name:        System.Int32
 46     MethodTable: 708f42a8
 47     EEClass:     709f8014
 48     Size:        12(0xc) bytes
 49     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 50     Fields:
 51               MT    Field   Offset                 Type VT     Attr    Value Name
 52         708f42a8  40005a2        0             System.Int32      1     instance           14     m_value
 53 [5] 02b82534
 54     Name:        System.Int32
 55     MethodTable: 708f42a8
 56     EEClass:     709f8014
 57     Size:        12(0xc) bytes
 58     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 59     Fields:
 60               MT    Field   Offset                 Type VT     Attr    Value Name
 61         708f42a8  40005a2        0             System.Int32      1     instance           15     m_value
 62 [6] 02b82538
 63     Name:        System.Int32
 64     MethodTable: 708f42a8
 65     EEClass:     709f8014
 66     Size:        12(0xc) bytes
 67     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 68     Fields:
 69               MT    Field   Offset                 Type VT     Attr    Value Name
 70         708f42a8  40005a2        0             System.Int32      1     instance           16     m_value
 71 [7] 02b8253c
 72     Name:        System.Int32
 73     MethodTable: 708f42a8
 74     EEClass:     709f8014
 75     Size:        12(0xc) bytes
 76     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 77     Fields:
 78               MT    Field   Offset                 Type VT     Attr    Value Name
 79         708f42a8  40005a2        0             System.Int32      1     instance           17     m_value
 80 [8] 02b82540
 81     Name:        System.Int32
 82     MethodTable: 708f42a8
 83     EEClass:     709f8014
 84     Size:        12(0xc) bytes
 85     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 86     Fields:
 87               MT    Field   Offset                 Type VT     Attr    Value Name
 88         708f42a8  40005a2        0             System.Int32      1     instance           18     m_value
 89 [9] 02b82544
 90     Name:        System.Int32
 91     MethodTable: 708f42a8
 92     EEClass:     709f8014
 93     Size:        12(0xc) bytes
 94     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 95     Fields:
 96               MT    Field   Offset                 Type VT     Attr    Value Name
 97         708f42a8  40005a2        0             System.Int32      1     instance           19     m_value
 98 [10] 02b82548
 99     Name:        System.Int32
100     MethodTable: 708f42a8
101     EEClass:     709f8014
102     Size:        12(0xc) bytes
103     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
104     Fields:
105               MT    Field   Offset                 Type VT     Attr    Value Name
106         708f42a8  40005a2        0             System.Int32      1     instance           20     m_value
View Code

           
2)引用類型數(shù)組
              
我們定義的數(shù)組:string[] stringArr = { "1", "2", "3", "4", "5" };
 1 0:000> !clrstack -l
 2 OS Thread Id: 0x2e54 (0)
 3 Child SP       IP Call Site
 4 00afeeec 7566f262 [HelperMethodFrame: 00afeeec] System.Diagnostics.Debugger.BreakInternal()
 5 00afef68 7146f195 System.Diagnostics.Debugger.Break() [f:\dd\ndp\clr\src\BCL\system\diagnostics\debugger.cs @ 91]
 6 
 7 00afef90 00ce0920 Example_6_1_3.Program.Main(System.String[]) [E:\Visual Studio 2022\...\Example_6_1_3\Program.cs @ 13]
 8     LOCALS:
 9         0x00afef9c = 0x02b82518
10         0x00afef98 = 0x02b82574(引用類型的數(shù)組)
11 
12 00aff118 71daf036 [GCFrame: 00aff118] 
13 0:000> !DumpObj /d 02b82574
14 Name:        System.String[]
15 MethodTable: 708f2d74
16 EEClass:     709f7820
17 Size:        32(0x20) bytes
18 Array:       Rank 1, Number of elements 5, Type CLASS (Print Array)
19 Fields:
20 None

              我們同樣使用【dp】命令,查看詳情。

1 0:000> dp 02b82574-0x4 l20
2 02b82570  00000000(同步塊索引) 708f2d74(方法表) 00000005(數(shù)組的長(zhǎng)度是5) 02b824c8(具體的元素了,是一個(gè)地址,可以使用【!do】命令)
3 02b82580  02b824d8 02b824e8 02b824f8 02b82508
4 02b82590  00000000 7093dbc4 00000002 00000000
5 02b825a0  7093dbc4 00000001 00000000 709444c4
6 02b825b0  00000000 02b82768 00000000 00000018
7 02b825c0  00000008 00000001 00000006 00000000
8 02b825d0  70944500 00000000 02b82640 02b826d4
9 02b825e0  02b825f0 00000004 00000011 00000000

              我們使用【!do】命令,查看元素詳情。

Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)
 1 0:000> !do 02b824c8
 2 Name:        System.String
 3 MethodTable: 708f24e4
 4 EEClass:     709f7690
 5 Size:        16(0x10) bytes
 6 File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 7 String:      1
 8 Fields:
 9       MT    Field   Offset                 Type VT     Attr    Value Name
10 708f42a8  4000283        4         System.Int32  1 instance        1 m_stringLength
11 708f2c9c  4000284        8          System.Char  1 instance       31 m_firstChar
12 708f24e4  4000288       70        System.String  0   shared   static Empty
13     >> Domain:Value  00dbd7b8:NotInit  <<
14 0:000> !do 02b824d8
15 Name:        System.String
16 MethodTable: 708f24e4
17 EEClass:     709f7690
18 Size:        16(0x10) bytes
19 File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
20 String:      2
21 Fields:
22       MT    Field   Offset                 Type VT     Attr    Value Name
23 708f42a8  4000283        4         System.Int32  1 instance        1 m_stringLength
24 708f2c9c  4000284        8          System.Char  1 instance       32 m_firstChar
25 708f24e4  4000288       70        System.String  0   shared   static Empty
26     >> Domain:Value  00dbd7b8:NotInit  <<
View Code

              當(dāng)然,我們也可以使用【!da -details】命令。

Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)
 1 0:000> !da -details 02b82574
 2 Name:        System.String[]
 3 MethodTable: 708f2d74
 4 EEClass:     709f7820
 5 Size:        32(0x20) bytes
 6 Array:       Rank 1, Number of elements 5, Type CLASS
 7 Element Methodtable: 708f24e4
 8 [0] 02b824c8
 9     Name:        System.String
10     MethodTable: 708f24e4
11     EEClass:     709f7690
12     Size:        16(0x10) bytes
13     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
14     String:          1    
15     Fields:
16               MT    Field   Offset                 Type VT     Attr    Value Name
17         708f42a8  4000283        4             System.Int32      1     instance            1     m_stringLength
18         708f2c9c  4000284        8              System.Char      1     instance           31     m_firstChar
19         708f24e4  4000288       70            System.String      0       shared   static     Empty
20         >> Domain:Value      00dbd7b8:NotInit      <<
21 [1] 02b824d8
22     Name:        System.String
23     MethodTable: 708f24e4
24     EEClass:     709f7690
25     Size:        16(0x10) bytes
26     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
27     String:          2    
28     Fields:
29               MT    Field   Offset                 Type VT     Attr    Value Name
30         708f42a8  4000283        4             System.Int32      1     instance            1     m_stringLength
31         708f2c9c  4000284        8              System.Char      1     instance           32     m_firstChar
32         708f24e4  4000288       70            System.String      0       shared   static     Empty
33         >> Domain:Value      00dbd7b8:NotInit      <<
34 [2] 02b824e8
35     Name:        System.String
36     MethodTable: 708f24e4
37     EEClass:     709f7690
38     Size:        16(0x10) bytes
39     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
40     String:          3    
41     Fields:
42               MT    Field   Offset                 Type VT     Attr    Value Name
43         708f42a8  4000283        4             System.Int32      1     instance            1     m_stringLength
44         708f2c9c  4000284        8              System.Char      1     instance           33     m_firstChar
45         708f24e4  4000288       70            System.String      0       shared   static     Empty
46         >> Domain:Value      00dbd7b8:NotInit      <<
47 [3] 02b824f8
48     Name:        System.String
49     MethodTable: 708f24e4
50     EEClass:     709f7690
51     Size:        16(0x10) bytes
52     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
53     String:          4    
54     Fields:
55               MT    Field   Offset                 Type VT     Attr    Value Name
56         708f42a8  4000283        4             System.Int32      1     instance            1     m_stringLength
57         708f2c9c  4000284        8              System.Char      1     instance           34     m_firstChar
58         708f24e4  4000288       70            System.String      0       shared   static     Empty
59         >> Domain:Value      00dbd7b8:NotInit      <<
60 [4] 02b82508
61     Name:        System.String
62     MethodTable: 708f24e4
63     EEClass:     709f7690
64     Size:        16(0x10) bytes
65     File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
66     String:          5    
67     Fields:
68               MT    Field   Offset                 Type VT     Attr    Value Name
69         708f42a8  4000283        4             System.Int32      1     instance            1     m_stringLength
70         708f2c9c  4000284        8              System.Char      1     instance           35     m_firstChar
71         708f24e4  4000288       70            System.String      0       shared   static     Empty
72         >> Domain:Value      00dbd7b8:NotInit      <<
View Code

       
2.5、異常的轉(zhuǎn)儲(chǔ)
            測(cè)試代碼:Example_4_1_2
          
我們必須先要下載 procdump 程序,這個(gè)程序分兩個(gè)版本,32 位和64 位的,使用它注冊(cè) aedebug。打開(kāi) procdump 文件所在的目錄,就可以執(zhí)行下面的命令了。
            操作步驟:
            1)下載 procdump
                下載地址:https://learn.microsoft.com/zh-cn/sysinternals/downloads/procdump
            2)創(chuàng)建保存dump的目錄,不創(chuàng)建會(huì)出錯(cuò)。
                F:\Test\TestDump
            3)注冊(cè) Aedbug。
                打開(kāi) cmd 窗口,執(zhí)行如下的命令:procdump -ma -i F:\Test\TestDump
              Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)

            4)運(yùn)行程序,保存dump
                故意輸入0,系統(tǒng)崩潰。
                Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)


?? ???           5)運(yùn)行 windbg

              我們打開(kāi) windbg Preview,點(diǎn)擊【文件】菜單,然后選擇【Open dump file】,打開(kāi)文件。
              我們輸出所有線程,使用【!t】命令。
 1 0:000> !t
 2 ThreadCount:      2
 3 UnstartedThread:  0
 4 BackgroundThread: 1
 5 PendingThread:    0
 6 DeadThread:       0
 7 Hosted Runtime:   no
 8                                                                          Lock  
 9        ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
10    0    1 2048 0081da18     2a020 Preemptive  0284F400:00000000 00817c30 0     MTA System.DivideByZeroException 028450c0
11    5    2 334c 0082db60     2b220 Preemptive  00000000:00000000 00817c30 0     MTA (Finalizer) 

                紅色標(biāo)注,說(shuō)明主線程發(fā)生了異常。繼續(xù)使用【!pe[exception]】命令查看異常詳情。

 1 :000> !pe
 2 Exception object: 028450c0
 3 Exception type:   System.DivideByZeroException
 4 Message:          嘗試除以零。
 5 InnerException:   <none>
 6 StackTrace (generated):
 7     SP       IP       Function
 8     006FEFE0 026408A5 Example_6_1_4!Example_6_1_4.Program.Main(System.String[])+0x5d
 9 
10 StackTraceString: <none>
11 HResult: 80020012

                我們可以繼續(xù)使用【!do】命令查看異常對(duì)象。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-746049.html

 1 0:000> !DumpObj /d 028450c0
 2 Name:        System.DivideByZeroException
 3 MethodTable: 708fd01c
 4 EEClass:     70ad84fc
 5 Size:        84(0x54) bytes
 6 File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
 7 Fields:
 8       MT    Field   Offset                 Type VT     Attr    Value Name
 9 708f24e4  40002a4        4        System.String  0 instance 0284ce64 _className
10 708f6f28  40002a5        8 ...ection.MethodBase  0 instance 00000000 _exceptionMethod
11 708f24e4  40002a6        c        System.String  0 instance 00000000 _exceptionMethodString
12 708f24e4  40002a7       10        System.String  0 instance 0284b5d8 _message
13 7093f8fc  40002a8       14 ...tions.IDictionary  0 instance 00000000 _data
14 708f25d4  40002a9       18     System.Exception  0 instance 00000000 _innerException
15 708f24e4  40002aa       1c        System.String  0 instance 00000000 _helpURL
16 708f2734  40002ab       20        System.Object  0 instance 0284b670 _stackTrace
17 708f2734  40002ac       24        System.Object  0 instance 0284b6a0 _watsonBuckets
18 708f24e4  40002ad       28        System.String  0 instance 00000000 _stackTraceString
19 708f24e4  40002ae       2c        System.String  0 instance 00000000 _remoteStackTraceString
20 708f42a8  40002af       3c         System.Int32  1 instance        0 _remoteStackIndex
21 708f2734  40002b0       30        System.Object  0 instance 00000000 _dynamicMethods
22 708f42a8  40002b1       40         System.Int32  1 instance -2147352558 _HResult
23 708f24e4  40002b2       34        System.String  0 instance 00000000 _source
24 708f7b18  40002b3       44        System.IntPtr  1 instance   6fe8a4 _xptrs
25 708f42a8  40002b4       48         System.Int32  1 instance -1073741676 _xcode
26 70903adc  40002b5       4c       System.UIntPtr  1 instance        0 _ipForWatsonBuckets
27 709362d0  40002b6       38 ...ializationManager  0 instance 0284b654 _safeSerializationManager
28 708f2734  40002a3       84        System.Object  0   shared   static s_EDILock
29     >> Domain:Value  00817c30:NotInit  <<


四、總結(jié)
    
終于寫(xiě)完了,為什么說(shuō)是終于,因?yàn)閷?xiě)這一篇文章,不是一天完成的。今天介紹的是值類型、應(yīng)用類型的區(qū)別,另外在加上數(shù)組和異常崩潰的解決思路,現(xiàn)在終于做到知其一也知其二了,但是這個(gè)過(guò)程不好熬。為什么不好熬呢,基礎(chǔ)差,沒(méi)有匯編基礎(chǔ),什么棧幀,棧地址,都沒(méi)有什么概念,沒(méi)有別的辦法,努力補(bǔ)充起來(lái),底層的東西,一遍肯定是不行的。好了,不說(shuō)了,不忘初心,繼續(xù)努力,希望老天不要辜負(fù)努力的人。

到了這里,關(guān)于Net 高級(jí)調(diào)試之六:對(duì)象檢查之值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲(chǔ)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JavaScript引用數(shù)據(jù)類型(對(duì)象類型)和原始(基本)數(shù)據(jù)類型特點(diǎn)比較

    JavaScript引用數(shù)據(jù)類型(對(duì)象類型)和原始(基本)數(shù)據(jù)類型特點(diǎn)比較

    為講解JavaScript引用數(shù)據(jù)類型(對(duì)象類型)和原始(基本)數(shù)據(jù)類型特點(diǎn)比較,需要先回顧JavaScript數(shù)據(jù)類型有哪些? 一)原始(primitive:原始、基本)數(shù)據(jù)類型,也稱為原始值(primitive value),包括: 1.布爾值(Boolean),其字面值只有兩個(gè),分別是true和false。 2.null,Null類型

    2024年02月05日
    瀏覽(17)
  • Net 高級(jí)調(diào)試之四:Windbg 動(dòng)態(tài)調(diào)試

    Net 高級(jí)調(diào)試之四:Windbg 動(dòng)態(tài)調(diào)試

    一、簡(jiǎn)介 今天是《Net 高級(jí)調(diào)試》的第四篇文章。到今天為止,也有三篇文章了,對(duì) Windbg 也有初步的認(rèn)識(shí)了,當(dāng)然,一個(gè)工具流暢、熟練的使用,對(duì)于我們調(diào)試 Net 程序是至關(guān)重要的。在前幾篇文章的基礎(chǔ)上,我們這篇文章主要介紹一些和使用 Windbg 有關(guān)的命令和操作。就我

    2024年02月06日
    瀏覽(25)
  • Net 高級(jí)調(diào)試之一:開(kāi)始認(rèn)識(shí)一些調(diào)試工具

    Net 高級(jí)調(diào)試之一:開(kāi)始認(rèn)識(shí)一些調(diào)試工具

    一、簡(jiǎn)介 從今天開(kāi)始一個(gè)長(zhǎng)系列,Net 高級(jí)調(diào)試的相關(guān)文章,我自從學(xué)習(xí)了之后,以前很多模糊的地方現(xiàn)在很清楚了,原來(lái)自己的功力還是不夠,所以有很多不明白,通過(guò)學(xué)習(xí) Net 高級(jí)調(diào)試,眼前豁然開(kāi)朗,茅塞頓開(kāi)。其實(shí),剛開(kāi)始要學(xué)習(xí)《Net 高級(jí)調(diào)試》,還是很是很困難的

    2024年02月08日
    瀏覽(24)
  • Net 高級(jí)調(diào)試之十:輕量級(jí)代碼生成的調(diào)試

    Net 高級(jí)調(diào)試之十:輕量級(jí)代碼生成的調(diào)試

    一、簡(jiǎn)介 今天是《Net 高級(jí)調(diào)試》的第十篇文章。說(shuō)起來(lái),高級(jí)調(diào)試,調(diào)試的內(nèi)容還是挺多的,技巧也不少,但是,要想做一個(gè)合格的高級(jí)調(diào)試人員,還需要掌握如何調(diào)試動(dòng)態(tài)生成的IL代碼。今天要探討的高級(jí)調(diào)試的技巧是如何調(diào)試通過(guò) Emit 動(dòng)態(tài)生成 IL 代碼??赡苡腥藭?huì)問(wèn),

    2024年02月05日
    瀏覽(95)
  • 聊一聊 .NET高級(jí)調(diào)試 內(nèi)核模式堆泄露

    聊一聊 .NET高級(jí)調(diào)試 內(nèi)核模式堆泄露

    前幾天有位朋友找到我,說(shuō)他的機(jī)器內(nèi)存在不斷的上漲,但在任務(wù)管理器中查不出是哪個(gè)進(jìn)程吃的內(nèi)存,特別奇怪,截圖如下: 在我的分析旅程中都是用戶態(tài)模式的內(nèi)存泄漏,像上圖中的異常征兆已經(jīng)明確告訴你了,不是用戶態(tài)程序吃的內(nèi)存,那就是內(nèi)核態(tài)程序吃的,比如:

    2024年02月04日
    瀏覽(20)
  • Net 高級(jí)調(diào)試之九:SOSEX 擴(kuò)展命令介紹

    Net 高級(jí)調(diào)試之九:SOSEX 擴(kuò)展命令介紹

    一、介紹 今天是《Net 高級(jí)調(diào)試》的第九篇文章。這篇文章設(shè)計(jì)的內(nèi)容挺多的,比如:擴(kuò)展的斷點(diǎn)支持,如何查找元數(shù)據(jù),?;厮荩瑢?duì)象檢查,死鎖檢測(cè)等等,內(nèi)容挺多的。功能特別強(qiáng)大,使用特別方便, 但是需要說(shuō)明一點(diǎn),這些功能不是 SOS 的功能,是 SOSEX 的擴(kuò)展功能,但

    2024年02月05日
    瀏覽(16)
  • 聊一聊 .NET高級(jí)調(diào)試 中的一些內(nèi)存術(shù)語(yǔ)

    聊一聊 .NET高級(jí)調(diào)試 中的一些內(nèi)存術(shù)語(yǔ)

    在高級(jí)調(diào)試的旅程中,經(jīng)常會(huì)有一些朋友問(wèn)我什么是 工作集(內(nèi)存) ,什么是 提交大小 ,什么是 Virtual Size , 什么是 Working Set 。。。截圖如下: 既然有很多朋友問(wèn),這些用口頭也不怎么好描述,剛好上午有時(shí)間就系統(tǒng)的聊一下吧。 可能有些朋友知道,內(nèi)存中的虛擬地址被劃分

    2024年02月05日
    瀏覽(20)
  • Net 高級(jí)調(diào)試之七:線程操作相關(guān)命令介紹

    Net 高級(jí)調(diào)試之七:線程操作相關(guān)命令介紹

    一、簡(jiǎn)介 今天是《Net 高級(jí)調(diào)試》的第七篇文章。上一篇文章我們說(shuō)了值類型,引用類型,數(shù)組等的內(nèi)存表現(xiàn)形式。有了這個(gè)基礎(chǔ),我們可以更好的了解我們的程序在運(yùn)行時(shí)的狀態(tài),內(nèi)存里有什么東西,它們的結(jié)構(gòu)組成是什么樣子的,對(duì)我們調(diào)試程序是更有幫助的。今天,我

    2024年02月05日
    瀏覽(17)
  • Net 高級(jí)調(diào)試之八:代碼審查及雜項(xiàng)命令

    Net 高級(jí)調(diào)試之八:代碼審查及雜項(xiàng)命令

    一、簡(jiǎn)介 今天是《Net 高級(jí)調(diào)試》的第八篇文章。這篇文章設(shè)計(jì)的內(nèi)容挺多的,比如:如何查看方法的匯編代碼,如何獲取方法的描述符,對(duì)象同步塊的轉(zhuǎn)儲(chǔ),對(duì)象方法表的轉(zhuǎn)儲(chǔ),托管堆和垃圾回收器信息的轉(zhuǎn)儲(chǔ),CLR 的版本,GC 模式,等等,內(nèi)容挺多的。內(nèi)容雖然挺多,但是

    2024年02月05日
    瀏覽(33)
  • JVM零基礎(chǔ)到高級(jí)實(shí)戰(zhàn)之對(duì)象存活算法引用計(jì)數(shù)法存在的特點(diǎn)分析

    JVM零基礎(chǔ)到高級(jí)實(shí)戰(zhàn)之對(duì)象存活算法引用計(jì)數(shù)法存在的特點(diǎn)分析 JVM零基礎(chǔ)到高級(jí)實(shí)戰(zhàn)之對(duì)象存活算法引用計(jì)數(shù)法存在的特點(diǎn)分析 優(yōu)點(diǎn) 引用計(jì)數(shù)收集器可以很快的執(zhí)行,交織在程序運(yùn)行中。對(duì)程序需要不被長(zhǎng)時(shí)間打斷的實(shí)時(shí)環(huán)境比較有利。 缺點(diǎn) 無(wú)法檢測(cè)出循環(huán)引用。如父對(duì)

    2024年02月15日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包