自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

AOT漫談: 如何調(diào)試C# AOT程序

開發(fā) 前端
大家看到命中斷點(diǎn)了也不要高興的太早,VS只適合調(diào)試Debug模式發(fā)布出來的程序,而實(shí)際情況大家更多的是以Release模式發(fā)布的,這種模式下用 VS 就不能很好的調(diào)試了。

一、背景

1. 講故事

上個月接到了二個C# AOT程序的故障分析,發(fā)現(xiàn)如今的C# AOT程序也開始在各個領(lǐng)域開枝散葉了,這是一件非常好的事情,本著對這類程序有一個專業(yè)的維修態(tài)度,開一個系列好好聊一聊吧,當(dāng)然我這里是漫談,文章沒有先后順序,先從如何調(diào)試開始吧。

二、如何調(diào)試AOT程序

1. 一個簡單的例子

現(xiàn)在的VS非常強(qiáng)大,新建模板的時候就有一個 Enable native AOT publish 選項(xiàng),勾完之后就會自動的在項(xiàng)目的 csproj 中添加配置節(jié) <PublishAot>true</PublishAot> ,截圖如下:

圖片圖片

勾選的好處就是可以在編碼階段就能感知到AOT不允許的東西,方便及時告警,生成完之后參考代碼如下:

static void Main(string[] args)
        {
            var i = 10;
            var j = 20;
            var sum = i + j;
            Console.WriteLine($"{i}+{j}={sum}");
            Console.ReadLine();
        }

代碼有了之后,可以借助dotnet cli的 publish 命令直接發(fā)布成nativeaot程序,這里先使用 Debug 模式,這樣就生成好了一個完整的程序,參考如下:

dotnet publish -r win-x64 -c Debug -o D:\testdump

圖片圖片

當(dāng)然你也可以帶上 PublishAot=true 參數(shù),即:

dotnet publish -r win-x64 -c Debug /p:PublishAot=true -o D:\testdump

2. 使用VS調(diào)試

用 VS調(diào)試非常簡單,直接將 ConsoleApp1.exe 拖到 VS 中即可,對,就是拖到VS中,然后在源碼的相應(yīng)位置下個斷點(diǎn),接下來在 ConsoleApp1.exe 上右鍵 -> Debug -> Start New Instance 即可啟動調(diào)試,截圖如下:

圖片圖片

大家看到命中斷點(diǎn)了也不要高興的太早,VS只適合調(diào)試Debug模式發(fā)布出來的程序,而實(shí)際情況大家更多的是以Release模式發(fā)布的,這種模式下用 VS 就不能很好的調(diào)試了。

為了驗(yàn)證,我們簡單的修改一下 Debug 改成 Release 模式,參考如下:

PS D:\skyfly\18.20241010\src\Example\ConsoleApp1> dotnet publish -r win-x64 -c Release -o D:\testdump
  正在確定要還原的項(xiàng)目…
  所有項(xiàng)目均是最新的,無法還原。
  ConsoleApp1 -> D:\skyfly\18.20241010\src\Example\ConsoleApp1\bin\Release\net8.0\win-x64\ConsoleApp1.dll
  ConsoleApp1 -> D:\testdump\

有可用的工作負(fù)載更新。有關(guān)詳細(xì)信息,請運(yùn)行 `dotnet workload list`。

程序運(yùn)行以來之后,可以看到那些 i,j,sum 都不見了蹤影,無語了,截圖如下:

圖片圖片

3. WinDbg調(diào)試

水到絕境是風(fēng)景,人到絕境是重生。當(dāng)你絕望的時候一定要知道有WinDbg這種通殺一切之工具的存在,所以這次我們要祭出 WinDbg。

那用 windbg 如何調(diào)試呢?非常簡單,直接對 Main 方法下斷點(diǎn)即可,畢竟AOT程序在 ilc 階段就已經(jīng)編譯成完整的 機(jī)器碼,參考命令如下:

bp ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main

這個命令的格式如下:

bp 模塊名!模塊名_命名空間_類名__方法名

圖片圖片

參考匯編代碼如下:

0:000> uf ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main
ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main [D:\skyfly\18.20241010\src\Example\ConsoleApp1\Program.cs @ 9]:
    9 00007ff6`e4836d20 4883ec48        sub     rsp,48h
    9 00007ff6`e4836d24 0f57e4          xorps   xmm4,xmm4
    9 00007ff6`e4836d27 0f29642420      movaps  xmmword ptr [rsp+20h],xmm4
    9 00007ff6`e4836d2c 0f29642430      movaps  xmmword ptr [rsp+30h],xmm4
    9 00007ff6`e4836d31 33c0            xor     eax,eax
    9 00007ff6`e4836d33 4889442440      mov     qword ptr [rsp+40h],rax
   10 00007ff6`e4836d38 488d4c2420      lea     rcx,[rsp+20h]
   10 00007ff6`e4836d3d ba02000000      mov     edx,2
   10 00007ff6`e4836d42 41b803000000    mov     r8d,3
   10 00007ff6`e4836d48 e823f10200      call    ConsoleApp1!S_P_CoreLib_System_Runtime_CompilerServices_DefaultInterpolatedStringHandler___ctor (00007ff6`e4865e70)
   10 00007ff6`e4836d4d 488d4c2420      lea     rcx,[rsp+20h]
   10 00007ff6`e4836d52 ba0a000000      mov     edx,0Ah
   10 00007ff6`e4836d57 e8a48e0500      call    ConsoleApp1!S_P_CoreLib_System_Runtime_CompilerServices_DefaultInterpolatedStringHandler__AppendFormatted<Int32> (00007ff6`e488fc00)
   10 00007ff6`e4836d5c 8b4c2430        mov     ecx,dword ptr [rsp+30h]
   10 00007ff6`e4836d60 8b542440        mov     edx,dword ptr [rsp+40h]
   10 00007ff6`e4836d64 3bca            cmp     ecx,edx
   10 00007ff6`e4836d66 0f87c9000000    ja      ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0x115 (00007ff6`e4836e35)  Branch

ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0x4c [D:\skyfly\18.20241010\src\Example\ConsoleApp1\Program.cs @ 10]:
   10 00007ff6`e4836d6c 488b442438      mov     rax,qword ptr [rsp+38h]
   10 00007ff6`e4836d71 448bc1          mov     r8d,ecx
   10 00007ff6`e4836d74 4a8d0440        lea     rax,[rax+r8*2]
   10 00007ff6`e4836d78 2bd1            sub     edx,ecx
   10 00007ff6`e4836d7a 83fa01          cmp     edx,1
   10 00007ff6`e4836d7d 721d            jb      ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0x7c (00007ff6`e4836d9c)  Branch

ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0x5f [D:\skyfly\18.20241010\src\Example\ConsoleApp1\Program.cs @ 10]:
   10 00007ff6`e4836d7f 488d0d4a180600  lea     rcx,[ConsoleApp1!_Str___206014A4266C2082B9433011FB2991059F972D570A8B3C976E5B2B8DFCFBFC8D (00007ff6`e48985d0)]
   10 00007ff6`e4836d86 4883c10c        add     rcx,0Ch
   10 00007ff6`e4836d8a 0fb711          movzx   edx,word ptr [rcx]
   10 00007ff6`e4836d8d 668910          mov     word ptr [rax],dx
   10 00007ff6`e4836d90 8b4c2430        mov     ecx,dword ptr [rsp+30h]
   10 00007ff6`e4836d94 ffc1            inc     ecx
   10 00007ff6`e4836d96 894c2430        mov     dword ptr [rsp+30h],ecx
   10 00007ff6`e4836d9a eb11            jmp     ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0x8d (00007ff6`e4836dad)  Branch

ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0x7c [D:\skyfly\18.20241010\src\Example\ConsoleApp1\Program.cs @ 10]:
   10 00007ff6`e4836d9c 488d4c2420      lea     rcx,[rsp+20h]
   10 00007ff6`e4836da1 488d1528180600  lea     rdx,[ConsoleApp1!_Str___206014A4266C2082B9433011FB2991059F972D570A8B3C976E5B2B8DFCFBFC8D (00007ff6`e48985d0)]
   10 00007ff6`e4836da8 e893f20200      call    ConsoleApp1!S_P_CoreLib_System_Runtime_CompilerServices_DefaultInterpolatedStringHandler__GrowThenCopyString (00007ff6`e4866040)

ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0x8d [D:\skyfly\18.20241010\src\Example\ConsoleApp1\Program.cs @ 10]:
   10 00007ff6`e4836dad 488d4c2420      lea     rcx,[rsp+20h]
   10 00007ff6`e4836db2 ba14000000      mov     edx,14h
   10 00007ff6`e4836db7 e8448e0500      call    ConsoleApp1!S_P_CoreLib_System_Runtime_CompilerServices_DefaultInterpolatedStringHandler__AppendFormatted<Int32> (00007ff6`e488fc00)
   10 00007ff6`e4836dbc 8b4c2430        mov     ecx,dword ptr [rsp+30h]
   10 00007ff6`e4836dc0 8b542440        mov     edx,dword ptr [rsp+40h]
   10 00007ff6`e4836dc4 3bca            cmp     ecx,edx
   10 00007ff6`e4836dc6 776d            ja      ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0x115 (00007ff6`e4836e35)  Branch

ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0xa8 [D:\skyfly\18.20241010\src\Example\ConsoleApp1\Program.cs @ 10]:
   10 00007ff6`e4836dc8 488b442438      mov     rax,qword ptr [rsp+38h]
   10 00007ff6`e4836dcd 448bc1          mov     r8d,ecx
   10 00007ff6`e4836dd0 4a8d0440        lea     rax,[rax+r8*2]
   10 00007ff6`e4836dd4 2bd1            sub     edx,ecx
   10 00007ff6`e4836dd6 83fa01          cmp     edx,1
   10 00007ff6`e4836dd9 721d            jb      ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0xd8 (00007ff6`e4836df8)  Branch

ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0xbb [D:\skyfly\18.20241010\src\Example\ConsoleApp1\Program.cs @ 10]:
   10 00007ff6`e4836ddb 488d0dee1f0600  lea     rcx,[ConsoleApp1!_Str___E7DAC261E841E53EB65AC8C2A0E56544DF49C46D71E8002D7764F92C66C4C868 (00007ff6`e4898dd0)]
   10 00007ff6`e4836de2 4883c10c        add     rcx,0Ch
   10 00007ff6`e4836de6 0fb711          movzx   edx,word ptr [rcx]
   10 00007ff6`e4836de9 668910          mov     word ptr [rax],dx
   10 00007ff6`e4836dec 8b4c2430        mov     ecx,dword ptr [rsp+30h]
   10 00007ff6`e4836df0 ffc1            inc     ecx
   10 00007ff6`e4836df2 894c2430        mov     dword ptr [rsp+30h],ecx
   10 00007ff6`e4836df6 eb11            jmp     ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0xe9 (00007ff6`e4836e09)  Branch

ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0xd8 [D:\skyfly\18.20241010\src\Example\ConsoleApp1\Program.cs @ 10]:
   10 00007ff6`e4836df8 488d4c2420      lea     rcx,[rsp+20h]
   10 00007ff6`e4836dfd 488d15cc1f0600  lea     rdx,[ConsoleApp1!_Str___E7DAC261E841E53EB65AC8C2A0E56544DF49C46D71E8002D7764F92C66C4C868 (00007ff6`e4898dd0)]
   10 00007ff6`e4836e04 e837f20200      call    ConsoleApp1!S_P_CoreLib_System_Runtime_CompilerServices_DefaultInterpolatedStringHandler__GrowThenCopyString (00007ff6`e4866040)

ConsoleApp1!ConsoleApp1_ConsoleApp1_Program__Main+0xe9 [D:\skyfly\18.20241010\src\Example\ConsoleApp1\Program.cs @ 10]:
   10 00007ff6`e4836e09 488d4c2420      lea     rcx,[rsp+20h]
   10 00007ff6`e4836e0e ba1e000000      mov     edx,1Eh
   10 00007ff6`e4836e13 e8e88d0500      call    ConsoleApp1!S_P_CoreLib_System_Runtime_CompilerServices_DefaultInterpolatedStringHandler__AppendFormatted<Int32> (00007ff6`e488fc00)
   10 00007ff6`e4836e18 488d4c2420      lea     rcx,[rsp+20h]
   10 00007ff6`e4836e1d e8def00200      call    ConsoleApp1!S_P_CoreLib_System_Runtime_CompilerServices_DefaultInterpolatedStringHandler__ToStringAndClear (00007ff6`e4865f00)
   10 00007ff6`e4836e22 488bc8          mov     rcx,rax
   10 00007ff6`e4836e25 e856080000      call    ConsoleApp1!System_Console_System_Console__WriteLine_12 (00007ff6`e4837680)
   13 00007ff6`e4836e2a e831080000      call    ConsoleApp1!System_Console_System_Console__ReadLine (00007ff6`e4837660)
   14 00007ff6`e4836e2f 90              nop
   14 00007ff6`e4836e30 4883c448        add     rsp,48h
   14 00007ff6`e4836e34 c3              ret

仔細(xì)觀察上面的匯編代碼,你會發(fā)現(xiàn) i,j 根本就沒有作為棧變量使用,而是直接放到了寄存器中傳給了 AppendFormatted 方法。

圖片圖片

這里要提醒一點(diǎn)就是 DefaultInterpolatedStringHandler 是 C# 中 string 拼接的一種底層優(yōu)化實(shí)現(xiàn),所以最后代碼被優(yōu)化成了  Console.WriteLine($"{10}+{20}={30}"); 這樣的句子,這也是 Release 的威力所在。

當(dāng)然 WinDbg 的功能不限于此,后面還有更多牛叉的功能,在系列文章后面再展開吧。

三:總結(jié)

工欲善其事必先利其器,對未知知識的探索必然需要一個好的工具,希望本篇給大家?guī)硪恍╈`感吧。

責(zé)任編輯:武曉燕 來源: 一線碼農(nóng)聊技術(shù)
相關(guān)推薦

2024-10-24 11:08:00

C#AOT泛型

2024-10-14 13:01:33

AOTcpu符號

2023-07-11 00:17:58

.Net8AOTC

2025-04-08 00:09:38

2023-07-14 08:29:55

AOT.Net程序

2023-07-09 23:55:16

C++RoslynILC

2018-11-06 09:31:34

物聯(lián)網(wǎng)分析AoT物聯(lián)網(wǎng)

2025-04-02 07:40:30

2024-04-16 00:24:54

AndroidApp入口點(diǎn)

2023-09-11 08:40:34

AOTVMP代碼

2021-11-09 06:01:35

前端JITAOT

2011-06-08 10:06:32

C#

2023-09-21 08:46:44

操作系統(tǒng)windows 10內(nèi)存

2024-03-06 08:52:59

C#Emit代碼

2023-09-04 11:46:09

C#動態(tài)代碼

2023-09-15 06:56:01

RC.NET 6Release

2009-08-25 15:58:03

C#跟蹤和調(diào)試語句

2009-08-13 17:04:09

C#語言C#程序

2011-06-30 10:28:50

C#開發(fā)

2011-06-28 10:19:40

C#開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號