Advanced .Net Debugging 10:事後調試

来源:https://www.cnblogs.com/PatrickLiu/p/18228513
-Advertisement-
Play Games

當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...


一、介紹
    這是我的《Advanced .Net Debugging》這個系列的第十篇文章。這篇文章的內容是原書的第三部分的【高級主題】的第八章【事後調試】。前面幾篇文章,我們介紹了很多工具,可以幫助大家找出問題的所在。但是,有一類問題我們是沒辦法使用這些工具來解決的,那就是已經發佈的程式。在程式發佈後,總是會出現一些問題,並且這些問題出現的時機是不確定的,大多數出現在用戶在使用軟體的過程中。想要解決這樣的問題,我們當然會想到遠程調試,有時候可以,有時候是不可以的,當然,不可以的理由會有很多,比如:安全的原因等類似的。
    如果使用軟體的客戶拒絕對出現問題的軟體進行實時調試,並且本地又無法重現問題,那我們該怎麼辦呢?當然是有辦法的,那就是【事後調試】。
    【事後調試】的步驟:
      1)、觸發故障的發生。
      2)、抓取系統在發生故障時的狀態快照(根據不同的故障類型,在某些情況下還需要抓取故障發生前後的狀態快照)。
      3)、將快照發送給工程師作進一步的分析。
    在這篇文章中,我們將討論抓取快照的各種不同方式,不同類型的轉儲信息以及如何分析它們。
    當然,高級調試會涉及很多方面的內容,你對 .NET 基礎知識掌握越全面、細節越底層,調試成功的幾率越大,當我們遇到各種奇葩問題的時候才不會手足無措。
    如果在沒有說明的情況下,所有代碼的測試環境都是 Net 8.0,如果有變動,我會在項目章節里進行說明。好了,廢話不多說,開始我們今天的調試工作。

     調試環境我需要進行說明,以防大家不清楚,具體情況我已經羅列出來。
          操作系統:Windows Professional 10
          調試工具:Windbg Preview(Debugger Client:1.2306.1401.0,Debugger engine:10.0.25877.1004)和 NTSD(10.0.22621.2428 AMD64)
          下載地址:可以去Microsoft Store 去下載
          開發工具:Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.8.3
          Net 版本:.Net 8.0
          CoreCLR源碼:源碼下載

    在此說明:我使用了兩種調試工具,第一種:Windbg Preivew,圖形界面,使用方便,操作順手,不用擔心干擾;第二種是:NTSD,是命令行形式的調試器,在命令使用上和 Windbg 沒有任何區別,之所以增加了它的調試過程,不過是我的個人愛好,想多瞭解一些,看看他們有什麼區別,為了學習而使用的。如果在工作中,我推薦使用 Windbg Preview,更好用,更方便,也不會出現奇怪問題(我在使用 NTSD 調試斷點的時候,不能斷住,提示記憶體不可讀,Windbg preview 就沒有任何問題)。
    如果大家想瞭解調試過程,二選一即可,當然,我推薦查看【Windbg Preview 調試】。

二、目錄結構
    為了讓大家看的更清楚,也為了自己方便查找,我做了一個目錄結構,可以直觀的查看文章的佈局、內容,可以有針對性查看。

    2.1、轉儲文件基本知識
        2.1.1、通過調試器來生成轉儲文件
            A、基礎知識
            B、眼見為實
                1)、NTSD 調試
                2)、Windbg Preview 調試
        2.1.2、通過 ADPlus 生成轉儲文件
            A、基礎知識
            B、眼見為實
                1)、崩潰模式
        2.1.3、轉儲文件的調試
        2.1.4、數據訪問層
        2.1.5、轉儲文件分析:未處理的 .NET 異常
            1)、NTSD 調試
            2)、Windbg Preview 調試
    2.2、Windows 錯誤報告
        
三、調試源碼
    廢話不多說,本節是調試的源碼部分,沒有代碼,當然就談不上測試了,調試必須有載體。
    1、ExampleCore_8_01

 1 namespace ExampleCore_8_01
 2 {
 3     internal class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Program program = new Program();
 8             program.Run();
 9         }
10 
11         public void Run()
12         {
13             Console.WriteLine("Press any key to start");
14             Console.ReadKey();
15             ProcessData(null);
16         }
17 
18         public void ProcessData(string? data)
19         {
20             if (data == null)
21             {
22                 throw new ArgumentNullException("Argument is Null");
23             }
24             string s = "Hello:" + data;
25         }
26     }
27 }
View Code


四、基礎知識
    在這一段內容中,有的小節可能會包含兩個部分,分別是 A 和 B,也有可能只包含 A,如果只包含 A 部分,A 字母會省略。A 是【基礎知識】,講解必要的知識點,B 是【眼見為實】,通過調試證明講解的知識點。

    4.1、轉儲文件的基本知識
        轉儲文件是進程狀態的外在表示。生成轉儲文件的目的:在不需要對出問題的電腦進行實時訪問的情況下,就可以對程式故障進行分析。有了轉儲文件,調試人員就可以使用調試器的事後調試功能來分析故障。
        共有兩種類型的轉儲文件:
          1)、完全轉儲文件(Full Dump)
          2)、微型轉儲文件(Mini Dump)
        在完全轉儲文件中包含了進程的整個記憶體空間、可執行影響、句柄表和調試器需要使用的其他信息。當使用完全轉儲文件時不能指定所要收集的數據量。但是,我們可以使用調試器將完全轉儲文件轉換為微型轉儲文件。
        微型轉儲文件的內容是可變的,並且能根據使用的轉儲文件生成器進行定製。在微型轉儲文件中可以只包含某個線程的信息,也可以包含被轉儲進程的詳細信息。需要註意的是,在最大的微型轉儲文件中包含的內容要多於在完全轉儲文件中包含的內容。因此,我們這裡只介紹微型轉儲文件的結構。

        以下是能夠生成轉儲文件的工具列表:
          1)、Windows Debuggers(Windows 調試器):Windows 調試器可以生成各種不同大小的轉儲文件,並且能夠完全控制轉儲文件的生成過程。
          2)、ADPlus:ADPlus 是 Windows 調試工具集中的一個。它的作用相當於一個進程監視器,每當發生崩潰或者掛起時,都能生成轉儲文件。此外,它還能將崩潰事件通知給用戶。
          3)、Windows 錯誤報告:Windows錯誤報告是Microsoft提供的一種服務,用戶通過這種服務註冊到一個實時的錯誤報告站點。每當用戶的某個應用程式發生錯誤時,都會將一個錯誤報告從發生崩潰的機器發送到Windows錯誤報告站點。然後,在進行事後分析時可以從WER服務中提取崩潰信息(包括轉儲文件)。        

        以上都是書里介紹的內容,由於書寫的比較早,到現在還有很多其他工具可以生成轉儲文件,比如:任務管理器,Windbg 調試器,Process Explorer,PCHunter 等,使用起來也很方便,網上學習資料很多,我就不多說了。
        接下來,我們就針對這三種工具分別介紹如何生成轉儲文件。
        
        4.1.1、通過調試器生成轉儲文件
            A、基礎知識
                如果我們想使用調試器生成 DUMP 文件,可以使用【.dump】命令,【.dump /m】表示調試器將生成一個微型轉儲文件。當然【.dump】命令還有其他的選項,如下:
                  a、生成一個完整的微型轉儲文件,啟動所有選項。在這個文件中將包含完整的記憶體數據、句柄信息、模塊信息、基本的記憶體信息和線程信息等。相當於使用/mfFhut。
                  f、生成一個微型轉儲文件,其中包含進程內所有可訪問和已提交的記憶體頁。
                  F、生成一個微型轉儲文件,其中包含調試器在重構整個虛擬記憶體地址空間時需要的所有基本記憶體信息。
                  h、生成一個微型轉儲文件,其中包含句柄信息。
                  u、生成一個微型轉儲文件,其中包含未卸載模塊的信息。註意,這個選項只能在Windows Server 2003上使用。
                  t、生成一個微型轉儲文件,其中包含線程時間的信息。線上程時間信息中包括創建時間,以及在用戶態和內核態中執行的時間。
                  i、生成一個微型轉儲文件,其中包含輔助記憶體信息。輔助記憶體是指由棧指針或者後臺存儲使用的記憶體(及其周圍的一小塊記憶體)。
                  p、生成一個微型轉儲文件,其中包含進程環境塊和線程環境塊。
                  w、生成一個微型轉儲文件,其中包含所有已提交的讀-寫私有記憶體頁。
                  d、生成一個微型轉儲文件,其中包含映像中的所有數據段。
                  c、生成一個微型轉儲文件,其中包含映像中的所有代碼段。
                  r、生成一個微型轉儲文件,適合於在需要保護隱私的情況中使用。這個選項將刪除在重建棧時不需要的任何信息(將這些信息替換為0,包括局部變數)。
                  R、生成一個微型轉儲文件,適合在需要保護隱私的情況下使用。這個選項將從微型轉儲文件中刪除完整的模塊路徑,因此將確保用戶目錄結構的隱私性。
                舉個例子:我們在調試器中執行【.dump /ma /u F:\MyDump.dmp】命令,可以在F盤看到生成 dmp 文件到MyDump_1c90_2024-06-27_15-13-24-466_3660.dmp文件。 .dump命令參數比較多,常用的組合就是/ma,/m 表示生成minidump,/a 表示dmp包含所有信息,/u 參數就是上面說的附加時間和PID信息到文件名。

1 0:000> .dump /ma /u F:\Test\TestDump\MyDump.dmp
2 Creating F:\Test\TestDump\MyDump_1c90_2024-06-27_15-13-24-466_3660.dmp - mini user dump
3 Dump successfully written

                當我們在生成一個轉儲文件的時候,有一個經驗法則,在轉儲文件中包含的狀態越多,在進行事後調試的時候就能獲取更多的信息。當然,最大的限制因素就是轉儲文件的大小。有時候你會發現無法從一個高安全的伺服器上獲取很大的轉儲文件,而只能對一個刪除了某些敏感信息之後的轉儲文件進行分析。
                如果我們使用命令行調試器,當我們需要載入 dump 文件時,必須使用【ntsd -z dumpFileName】命令才可以,我使用的是【ntsd】調試器。dumpFileName:必須包含 dump 文件的完整路徑和尾碼名。
                通過調試器生成轉儲文件的一個難點就是調試器必須在合適的時候被附加到故障進程上。一般來說,還好,但是對於崩潰情況是不定時的,是沒有規律的,這樣就很容易錯失附加調試器的機會。當我們的程式發生崩潰的時候 Windows 可以自動的生成轉儲文件就好了,這種機制是有的。我們可以使用“事後調試器設置(Postmortem Debugger Setup)”。我們可以使用以下命令來修改事後調試器:windbg -I、cdb -iae、ntsd -iae、drwtsn32 -i
                效果如圖:
                想要執行以上命令,直接打開【cmd】命令行工具,輸入命令【windbg -I】、【cdb -iae】、【ntsd -iae】、【drwtsn32 -i】就可以了。
                修改註冊表的值:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
                效果如圖:
                

                這個結果是我執行【cdb -iae】命令的結果。命令視窗如圖:
                

                我們可以直接運行我們的實常式序,控制台程式一旦拋出異常,立刻就能打開我們註冊調試器。
                  1)先演示執行【Windbg -I】命令後的效果。
                    雙擊我們的控制台程式,看到“Press any key to start”字樣,然後點擊回車鍵,就會打開指定的調試器。
                    效果如圖:
                    

                  2)、先演示執行【cdb -iae】命令後的效果。
                    雙擊我們的控制台程式,看到“Press any key to start”字樣,然後點擊回車鍵,就會打開指定的調試器。
                    效果如圖:
                    

                轉儲文件生成註意事項:
                  在 Windows Vista 中修改了錯誤報告技術在本地機器上保存轉儲文件的方式。在 Windows Vista 之前,Dr.Watson 預設將生成的轉儲文件保存在本地機器上。這些轉儲文件可以由任何一個想要調試轉儲文件的用戶訪問。在 Windows Vista 中去掉了 Dr.Watson,而是引入了一種更為可靠和穩定的錯誤報告機制。其中的修改之一就是,生成的轉儲文件(在預設情況下)不會被保存到本地機器上。要改變這種預設行為,可以將註冊表 ForceQueue 設置為1,這將使所有轉儲文件在上傳到 Microsoft 之前就在本地機器上排隊。ForceQueue 註冊鍵值位於以下註冊路徑:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting          
                  在註冊鍵值 ForceQueue 被設置為1後,生成的所有轉儲文件都將被保存到以下位置:
                  對於在系統上下文中運行或者被提升到系統上下文中運行的進程:
                  %ALLUSERSPROFILE %\Microsoft\Windows\WER\[ReportQueue|ReportArchive]
                  對於所有其他的進程:
                  %LOCALAPPDATA%\Microsoft\Windows\WER\[ReportQueue|ReportArchive]

                當調試非托管代碼程式時,會用到 AeDebug 鍵值。然而,對於托管代碼調試,可以使用【DbgManagedDebugger】和【DbgJITDebugLaunchSetting】這兩個鍵值控制器調試。該鍵值位置:電腦\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework,效果如圖:
                

                  1)DbgManagedDebugger:該註冊鍵值會指定當遇到未處理的異常時應該啟動哪一個調試器。當遇到未處理的異常時,該註冊鍵值指定的調試器並不會立即調用,而是顯示一個消息框,由用戶選擇是調試程式還是結束程式。在事後調試中,一個很常見的問題就是,如何在程式發生故障的時候自動生成轉儲文件。
                    我們可以執行以下命令【ntsd -pv -p %ld -c ",dump /u /ma <path to dump file>; .kill; qd】,該命令的意思是,當一個故障發生時,啟動【ntsd】調試器,並且執行【.dump】命令生成一個轉儲文件,然後退出調試回話。

                  2)、DbgJITDebugLaunchSetting:該註冊鍵值表示發生未處理異常時的行為。如果這個值被設置為 0,那麼將顯示一個消息框,並由用戶選擇對故障採用何種處理方式。請註意,只有在交互進程的情況下才會顯示這個消息框,而對於其他進程(例如服務)則是直接結束。
                    如果 DbgJITDebugLaunchSetting 被設置 1,那麼程式會直接結束,並返回一個棧轉儲。
                    如果 DbgJITDebugLaunchSetting 被設置 2,那麼將立刻啟動在 DbgManagedDebugger 中指定的調試器,而不會顯示消息框。
                    如果 DbgJITDebugLaunchSetting 被設置 16,對於互動式進程會顯示前面的消息框,而對於非互動式進程則會直接啟動在 DbgManagedDebugger 中指定的調試器。

            B、眼見為實
                調試源碼:ExampleCore_8_01
                調試任務:通過 Windows 調試器生成轉儲文件。
                1)、NTSD 調試
                    編譯項目,打開【Visual Studio 2022 Developer Command Prompt v17.9.6】命令行工具,輸入命令【NTSD E:\Visual Studio 2022\Source\Projects\AdvancedDebug.NetFramework.Test\ExampleCore_8_01\bin\Debug\net8.0\ExampleCore_8_01.exe】打開調試器。
                    進入調試器,我們直接使用【g】命令,運行調試器,直到看到調試器輸入“Press any key to start”字樣,我們按回車鍵,讓調試器繼續執行,發現現在的調試器已經中斷執行了。
                    我們可以執行【!clrstack】命令,查看一下當前的線程調用棧。

1 0:000> !clrstack
2 OS Thread Id: 0x1764 (0)
3         Child SP               IP Call Site
4 000000132477E8A8 00007ff87ecbcf19 [HelperMethodFrame: 000000132477e8a8]
5 000000132477E9A0 00007FFF41F21AFB ExampleCore_8_01.Program.ProcessData(System.String)
6 000000132477EA00 00007FFF41F21A46 ExampleCore_8_01.Program.Run()
7 000000132477EA50 00007FFF41F21988 ExampleCore_8_01.Program.Main(System.String[])
8 0:000>

                    接下來,我們使用【.dump /mf F:\Test\TestDump\08dumpfile2.dmp】命令,生成轉儲文件,保存目錄在 F:\Test\TestDump 下,文件名稱是 08dumpfile2.dmp。說明一下,文件名為什麼加一個 2,因為我已經生成一個文件了,文件名必須不同,否則會有錯誤。

1 0:000> .dump /mf F:\Test\TestDump\08dumpfile.dmp
2 Unable to create file 'F:\Test\TestDump\08dumpfile.dmp' - Win32 error 0n80
3     "文件存在。"

                    文件名修改後,繼續執行,看到“Dump successfully written”字樣就說明成功了。

1 0:000> .dump /mf F:\Test\TestDump\08dumpfile2.dmp
2 Creating F:\Test\TestDump\08dumpfile2.dmp - mini user dump
3 Dump successfully written

                    我們需要再打開一個【NTSD】調試器,執行【NTSD -z F:\Test\TestDump\08dumpfile2.dmp】命令,載入我們剛剛生成的 DUMP 文件。

1 ** Visual Studio 2022 Developer Command Prompt v17.9.6
2 ** Copyright (c) 2022 Microsoft Corporation
3 **********************************************************************
4 
5 D:\Program Files\Microsoft Visual Studio\2022\Community>NTSD -z F:\Test\TestDump\08dumpfile2.dmp

                    調試器顯示如下:

 1 Microsoft (R) Windows Debugger Version 10.0.22621.2428 AMD64
 2 Copyright (c) Microsoft Corporation. All rights reserved.
 3 
 4 
 5 Loading Dump File [F:\Test\TestDump\08dumpfile2.dmp]
 6 User Mini Dump File with Full Memory: Only application data is available
 7 
 8 Symbol search path is: srv*
 9 Executable search path is:
10 Windows 10 Version 19045 MP (4 procs) Free x64
11 Product: WinNt, suite: SingleUserTS
12 Edition build lab: 19041.1.amd64fre.vb_release.191206-1406
13 Machine Name:
14 Debug session time: Wed Jun 26 17:02:22.000 2024 (UTC + 8:00)
15 System Uptime: 0 days 6:57:46.621
16 Process Uptime: 0 days 0:05:15.000
17 ..................................
18 This dump file has an exception of interest stored in it.
19 The stored exception information can be accessed via .ecxr.
20 (4fa8.1764): CLR exception - code e0434352 (first/second chance not available)
21 For analysis of this file, run !analyze -v
22 KERNELBASE!RaiseException+0x69:
23 00007ff8`7ecbcf19 0f1f440000      nop     dword ptr [rax+rax]

                    第一部分紅色標註的說明載入 DUMP 文件的信息,第二部分紅色標註的就是故障原因(CLR 異常)。
                    接下來,我們就可以使用各種命令調試我們的程式了。

                2)、Windbg Preview 調試
                    編譯項目,打開【Windbg Preview】調試器,依次點擊【文件】----【Launch executable】,載入我們的項目文件 ExampleCore_8_01.exe,進入到調試器中。
                    直接【g】命令運行調試器,直到我們的控制台程式輸入“Press any key to start”字樣,我們在控制台程式中,按任何鍵繼續執行。此時,調試器會中斷執行,因為拋出了異常。
                    我們可以使用【!clrstack】命令查看一下調用棧的情況。

1 0:000> !clrstack
2 OS Thread Id: 0x3758 (0)
3         Child SP               IP Call Site
4 000000DB2357E988 00007ff87ecbcf19 [HelperMethodFrame: 000000db2357e988] 
5 000000DB2357EA80 00007fff3fb21afb ExampleCore_8_01.Program.ProcessData(System.String) [E:\Visual Studio 2022\Source\Projects\AdvancedDebug.NetFramework.Test\ExampleCore_8_01\Program.cs @ 22]
6 000000DB2357EAE0 00007fff3fb21a46 ExampleCore_8_01.Program.Run() [E:\Visual Studio 2022\Source\Projects\AdvancedDebug.NetFramework.Test\ExampleCore_8_01\Program.cs @ 15]
7 000000DB2357EB30 00007fff3fb21988 ExampleCore_8_01.Program.Main(System.String[]) [E:\Visual Studio 2022\Source\Projects\AdvancedDebug.NetFramework.Test\ExampleCore_8_01\Program.cs @ 8]

                    說明我們的程式執行到 ProcessData 方法的第 22 行出現了問題,因為我們拋出了異常。紅色標註的 22 就是源代碼中發生問題的行號。

                    接下來,我們使用【.dump /mf F:\Test\TestDump\08dumpfile.dmp】命令,生成轉儲文件,保存目錄在 F:\Test\TestDump 下,文件名稱是 08dumpfile.dmp

1 0:000> .dump /mf F:\Test\TestDump\08dumpfile.dmp
2 Creating F:\Test\TestDump\08dumpfile.dmp - mini user dump
3 Dump successfully written

                    當我們看到了“Dump successfully written”字樣時,說明 Dump 文件寫成功了,在指定目錄就能看到該文件。
                    我們有了 DUMP 文件,我們再打開一個【Windbg Preview】調試器載入 DUMP 文件就可以了。依次點擊【文件】----【Open dump file】,在右側通過瀏覽按鈕選擇我們的 Dump 文件,點擊【open】按鈕,就可以了。

 1 ************* Preparing the environment for Debugger Extensions Gallery repositories **************
 2    ExtensionRepository : Implicit
 3    UseExperimentalFeatureForNugetShare : false
 4    AllowNugetExeUpdate : false
 5    NonInteractiveNuget : true
 6    AllowNugetMSCredentialProviderInstall : false
 7    AllowParallelInitializationOfLocalRepositories : true
 8 
 9    EnableRedirectToV8JsProvider : false
10 
11    -- Configuring repositories
12       ----> Repository : LocalInstalled, Enabled: true
13       ----> Repository : UserExtensions, Enabled: true
14 
15 >>>>>>>>>>>>> Preparing the environment for Debugger Extensions Gallery repositories completed, duration 0.000 seconds
16 
17 ************* Waiting for Debugger Extensions Gallery to Initialize **************
18 
19 >>>>>>>>>>>>> Waiting for Debugger Extensions Gallery to Initialize completed, duration 0.032 seconds
20    ----> Repository : UserExtensions, Enabled: true, Packages count: 0
21    ----> Repository : LocalInstalled, Enabled: true, Packages count: 41
22 
23 Microsoft (R) Windows Debugger Version 10.0.27553.1004 AMD64
24 Copyright (c) Microsoft Corporation. All rights reserved.
25 
26 
27 Loading Dump File [F:\Test\TestDump\08dumpfile.dmp]
28 User Mini Dump File with Full Memory: Only application data is available
29 
30 
31 ************* Path validation summary **************
32 Response                         Time (ms)     Location
33 Deferred                                       srv*
34 Symbol search path is: srv*
35 Executable search path is: 
36 Windows 10 Version 19045 MP (4 procs) Free x64
37 Product: WinNt, suite: SingleUserTS
38 Edition build lab: 19041.1.amd64fre.vb_release.191206-1406
39 Debug session time: Wed Jun 26 13:41:21.000 2024 (UTC + 8:00)
40 System Uptime: 0 days 3:36:45.501
41 Process Uptime: 0 days 0:16:15.000
42 .......................................................
43 This dump file has an exception of interest stored in it.
44 The stored exception information can be accessed via .ecxr.
45 (43e0.3758): CLR exception - code e0434352 (first/second chance not available)
46 For analysis of this file, run !analyze -v
47 KERNELBASE!RaiseException+0x69:
48 00007ff8`7ecbcf19 0f1f440000      nop     dword ptr [rax+rax]

                    第一部分紅色標註的說明載入 DUMP 文件的信息,第二部分紅色標註的就是故障原因(CLR 異常)。
                    接下來,我們就可以使用各種命令調試我們的程式了。


        4.1.2、通過 ADPlus 生成轉儲文件
            A、基礎知識
                ADPlus 工具能夠監測和自動化一個或者多個故障進程的轉儲文件生成過程,並且能夠在發生崩潰時通知用戶或者電腦。ADPlus 工具位於 windbg 安裝目錄,最早叫 adplus.vbs,以VBScript腳本提供,最新版改成了adplus.exe。我們可以使用【cmd】命令打開命令行工具,直接輸入 adplus 就可以運行,效果如下:

  1 C:\Users\Administrator>adplus
  2 Starting ADPlus
  3 ********************************************************
  4 *                                                      *
  5 * ADPLus Flash V 7.01.007 08/11/2011                   *
  6 *                                                      *
  7 *   For ADPlus documentation see ADPlus.doc            *
  8 *   New command line options:                          *
  9 *     -pmn <procname> - process monitor                *
 10 *        waits for a process to start                  *
 11 *     -po <procname> - optional process                *
 12 *        won't fail if this process isn't running      *
 13 *     -mss <LocalCachePath>                            *
 14 *        Sets Microsoft's symbol server                *
 15 *     -r <quantity> <interval in seconds>              *
 16 *        Runs -hang multiple times                     *
 17 *                                                      *
 18 *   ADPlusManager - an additional tool to facilitate   *
 19 *   the use of ADPlus in distributed environments like *
 20 *   computer clusters.                                 *
 21 *   Learn about ADPlusManager in ADPlus.doc            *
 22 *                                                      *
 23 ********************************************************
 24 
 25 
 26 ADPlus Version 7.01.007 08/11/2011
 27 
 28 ====================
 29 |  ADPlus Usage    |
 30 ====================
 31  Command line syntax options
 32         ADPlus -?   or 'ADPlus -help
 33             Displays this information.
 34 
 35         ADPlus -HelpConfig
 36             Displays the built-in key-words and the default behavior settings
 37  38 
 39         ADPlus <runmode> -o <OutputDirectory> [options]
 40         Run Modes:
 41             -Crash    Runs ADPlus in Crash mode
 42             -Hang     Runs ADPlus in Hang mode
 43 
 44 Selecting processes to attach
 45         -p <PID>  Defines a Process ID to be attached
 46         -pn <ProcessName> Defines a process name to be attached
 47         -po <ProcessName> Defines an optional process name to be attached
 48         -pmn <ProcessName> Defines a process name to be monitored
 49                 ADPlus will keep monitoring if a process with this name starts
 50                 and attach
 51         -sc <spawning command> Defines the application and parameters to be
 52                    started in the debugger
 53                    The -sc switch, if used, must be the last one
 54         -iis All iis related processes will be attached
 55                   like inetinfo, dllhost,mtx, etc.
 56 
 57 Symbol Path Options
 58 -y <symbol path>   Defines the symbol path to be used
 59 -yp <symbol path to add>   Defines an additional symbol path
 60 -mss <local cache>   Adds Microsoft Symbol Server to the symbol path
 61 
 62 Memory Dump Options
 63 -FullOnFirst   Sets ADPlus to create full dumps on first chance exceptions
 64 -MiniOnSecond  Sets ADPlus to create mini dumps on second chance exceptions
 65 -NoDumpOnFirst Sets ADPlus to not create any dumps on first chance exceptions
 66 -NoDumpOnSecond  Sets ADPlus to not create any dumps on second chance exceptions
 67 -do Dump Only - changes default behavior to not include additional info, just a dump
 68 
 69 Miscellaneous Options
 70 -c <config file name>   Defines a configuration file to be used
 71 -o <output directory>   Defines the directory where logs and dumps are
 72                          to be placed.
 73 -r <quantity> <interval in seconds> for multiple attachments in hang mode
 74 -dbg <debugger>  Allows you to select the debugger to be used
 75                     cdb, windbg or ntsd  (default is cdb)
 76 -dp    Debuggers path
 77 -gs    only generates the script file
 78 
 79 -ce <custom exception code>   Defines a custom exception to be monitored
 80                  -ce 0x80501001
 81 
 82 -bp <breakpoint parameters>   Sets a breakpoint
 83       Syntax: -bp address;optional_additional_parameters
 84                    -bp MyModule!MyClass::MyMethod
 85                    -bp MyModule!MyClass::MyMethod;MiniDump
 86 
 87 -CTCF  Creates a full dump on CTL+C, and quits
 88 -CTCFB  Creates a full dump on CTL+C, and breaks into the debugger
 89 -CTCV  No special action on CTL+C, just breaks in for user interaction
 90 -lcq  sets the last script command to Q (quit)
 91 -lcg  sets the last script command to G (go)
 92 -lcgn  sets the last script command to GN (go not handled)
 93 -lcqd  sets the last script command to QD (quit and detach)
 94 -lcv  sets the last script command to void (no command; waits for user input)
 95 -q2  sets the return action for second chance exceptions to Q (quit)
 96 -g2  sets the retu

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 數字簽名作為PDF文檔中的重要安全機制,不僅能夠驗證文件的來源,還能確保文件內容在傳輸過程中未被篡改。然而,如何正確驗證PDF文件的數字簽名,是確保文件完整性和可信度的關鍵。本文將詳細介紹如何使用免費.NET控制項通過C#驗證PDF簽名的有效性以及驗證PDF文檔是否被修改。 C# 驗證PDF數字簽名有 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...