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
  • 通過WPF的按鈕、文本輸入框實現了一個簡單的SpinBox數字輸入用戶組件並可以通過數據綁定數值和步長。本文中介紹了通過Xaml代碼實現自定義組件的佈局,依賴屬性的定義和使用等知識點。 ...
  • 以前,我看到一個朋友在對一個系統做初始化的時候,通過一組魔幻般的按鍵,調出來一個隱藏的系統設置界面,這個界面在常規的菜單或者工具欄是看不到的,因為它是一個後臺設置的關鍵界面,不公開,同時避免常規用戶的誤操作,它是作為一個超級管理員的入口功能,這個是很不錯的思路。其實Winform做這樣的處理也是很容... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他的程式每次關閉時就會自動崩潰,一直找不到原因讓我幫忙看一下怎麼回事,這位朋友應該是第二次找我了,分析了下 dump 還是挺經典的,拿出來給大家分享一下吧。 二:WinDbg 分析 1. 為什麼會崩潰 找崩潰原因比較簡單,用 !analyze -v 命 ...
  • 在一些報表模塊中,需要我們根據用戶操作的名稱,來動態根據人員姓名,更新報表的簽名圖片,也就是電子手寫簽名效果,本篇隨筆介紹一下使用FastReport報表動態更新人員簽名圖片。 ...
  • 最新內容優先發佈於個人博客:小虎技術分享站,隨後逐步搬運到博客園。 創作不易,如果覺得有用請在Github上為博主點亮一顆小星星吧! 博主開始學習編程於11年前,年少時還只會使用cin 和cout ,給單片機點點燈。那時候,類似async/await 和future/promise 模型的認知還不是 ...
  • 之前在阿裡雲ECS 99元/年的活動實例上搭建了一個測試用的MINIO服務,以前都是直接當基礎設施來使用的,這次準備自己學一下S3相容API相關的對象存儲開發,因此有了這個小工具。目前僅包含上傳功能,後續計劃開發一個類似圖床的對象存儲應用。 ...
  • 目錄簡介快速入門安裝 NuGet 包實體類User資料庫類DbFactory增刪改查InsertSelectUpdateDelete總結 簡介 NPoco 是 PetaPoco 的一個分支,具有一些額外的功能,截至現在 github 星數 839。NPoco 中文資料沒多少,我是被博客園群友推薦的, ...
  • 前言 前面使用 Admin.Core 的代碼生成器生成了通用代碼生成器的基礎模塊 分組,模板,項目,項目模型,項目欄位的基礎功能,本篇繼續完善,實現最核心的模板生成功能,並提供生成預覽及代碼文件壓縮下載 準備 首先清楚幾個模塊的關係,如何使用,簡單畫一個流程圖 前面完成了基礎的模板組,模板管理,項目 ...
  • 假設需要實現一個圖標和文本結合的按鈕 ,普通做法是 直接重寫該按鈕的模板; 如果想作為通用的呢? 兩種做法: 附加屬性 自定義控制項 推薦使用附加屬性的形式 第一種:附加屬性 創建Button的附加屬性 ButtonExtensions 1 public static class ButtonExte ...
  • 在C#中,委托是一種引用類型的數據類型,允許我們封裝方法的引用。通過使用委托,我們可以將方法作為參數傳遞給其他方法,或者將多個方法組合在一起,從而實現更靈活的編程模式。委托類似於函數指針,但提供了類型安全和垃圾回收等現代語言特性。 基本概念 定義委托 定義委托需要指定它所代表的方法的原型,包括返回類 ...