1. 下載windbg並安裝。 我下載的是 Windbg 6.12。註意,windbg分32位和64位,由分析環境的位數決定。我這裡安裝的是32位的。安裝過程很簡單,一路next就可以。 2. 準備被調試的程式。 新建一個C#控制台程式,使用如下代碼。編譯~ class Program { stat ...
1. 下載windbg並安裝。
我下載的是 Windbg 6.12。註意,windbg分32位和64位,由分析環境的位數決定。我這裡安裝的是32位的。安裝過程很簡單,一路next就可以。
2. 準備被調試的程式。
新建一個C#控制台程式,使用如下代碼。編譯~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Program { static void Main(string[] args) { TestClass tref = new TestClass(); Console.ReadKey(); } } public class TestClass { public int A = 7; public byte B = 1; public int C = 8; public byte D = 2; public byte E = 3; public byte F = 4; public int G = 9; }View Code
3. 到bin/debug目錄下,運行創建的程式
4. 打開Windbg。
初次使用,需要載入符號文件。選擇菜單: File - Symbol File Path,輸入:
srv*d:\SymbolsLocal*http://msdl.microsoft.com/download/symbols
5. 附件到進程
選擇 File - Attach to a process,然後在彈出的視窗中選擇我們正在運行的控制台程式
6. 載入 sos 工具
如下圖。然後輸入 .chain,用於確認sos.dll確實被載入。
7. 獲得主線程上的引用
輸入命令: ~0s
8. 輸出主線程上的線程棧信息
輸入命令 !clsstack -l 。可以看到,main方法有一個局部變數,地址是 0x020c2350
9. 輸出局部變數的信息
!dumpobj /d 0x020c2350 。如下圖
列印出來的內容:
Name:類名
MethodTable:方法表地址
Size:占用記憶體空間多少位元組
紅色框里,是該對象所有欄位的詳細信息表格,包含每個欄位的MT(方法表地址)、Offset(相對偏移量)、類型、VT(=1:值類型,=0:引用類型)、Attr(靜態的還是實例的)、欄位值、欄位名稱
註意,在offset中,可以看到每個欄位在記憶體的分佈,如下圖。
這麼分佈是為了欄位對齊。即,CLR為了節省空間,各個欄位在記憶體中,並不是按代碼定義的順序進行分佈的,而是把byte欄位合到一起,讓它們共同占用4個位元組。int每個變數占4個位元組。就形成了上圖的分佈。
10. 查看記憶體情況
選擇菜單 View - Memory,在Virtual中輸入剛纔變數地址,可以驗證上面所說的情況