當你使用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