2015-10-18 15 views
10

Tôi hiện đang đọc sách có tiêu đề Pro .NET Performance. Một trong các chương của nó chứa thông tin chi tiết về cấu trúc nội bộ kiểu tham chiếu. Bảng phương thức là một trong các trường nội bộ của cấu trúc bố cục kiểu tham chiếu. Người ta nói trong cuốn sách này rằng bảng phương thức bao gồm thông tin về TẤT CẢ các phương thức của một lớp. Tôi đang cố gắng để kiểm tra lý thuyết này với một chương trình nhỏ.net clr phương pháp cấu trúc bảng

class MyClass 
{ 
    public void M() 
    { 
    } 
} 

static void Main(string[] args) 
{ 
    MyClass m = new MyClass(); 
    m.M(); 
    Console.ReadLine(); 
} 

tôi bắt đầu chương trình này với phiên WinDbg My WinDbg trông giống như sau

!clrstack -a 
ConsoleApp.Program.Main(System.String[]) [c:\visual studio 2012\Projects\Algorithms\ConsoleApp\Program.cs @ 36] 
    PARAMETERS: 
     args (0x00bff274) = 0x02ba2fbc 
    LOCALS: 
     0x00bff270 = 0x02ba2fd8 

0x02ba2fd8 - là địa chỉ của MyClass dụ gì Tôi làm tiếp theo là cố gắng kết xuất mẫu MyClass

!do 0x02ba2fd8 

Name:  ConsoleApp.MyClass 
MethodTable: 00f84d74 
EEClass:  00f81840 
Size:  12(0xc) bytes 
File:  C:\visual studio 2012\Projects\Algorithms\ConsoleApp\bin\Debug\ConsoleApp.exe 
Fields: 
     MT Field Offset     Type VT  Attr Value Name 
601a4544 4000001  4   System.Int32 1 instance  10 Z 

Bước tiếp theo là đổ bảng phương thức (địa chỉ là 00f84d74)

!dumpmt -md 00f84d74 

EEClass:   00f81840 
Module:   00f83fbc 
Name:   ConsoleApp.MyClass 
mdToken:   02000002 
File:   C:\visual studio 2012\Projects\Algorithms\ConsoleApp\bin\Debug\ConsoleApp.exe 
BaseSize:  0xc 
ComponentSize: 0x0 
Slots in VTable: 6 
Number of IFaces in IFaceMap: 0 
-------------------------------------- 
MethodDesc Table 
    Entry MethodDe JIT Name 
6005a2c8 5fcf8354 PreJIT System.Object.ToString() 
60065600 5fcf835c PreJIT System.Object.Equals(System.Object) 
600319b0 5fcf837c PreJIT System.Object.GetHashCode() 
600316e8 5fcf8390 PreJIT System.Object.Finalize() 
012604c0 00f84d6c JIT ConsoleApp.MyClass..ctor() 
012604f8 00f84d60 JIT ConsoleApp.MyClass.M() 

Đầu ra từ lệnh! Dumpmt cho thấy bảng phương thức chứa mục nhập cho phương thức M(). Nhưng khi tôi cố gắng để đổ bộ nhớ tại địa chỉ 00f84d74

dd 00f84d74 

00f84d74 00000200 0000000c 00024188 00000004 
00f84d84 601a299c 00f83fbc 00f84db0 00f81840 
00f84d94 012604c0 00000000 00f84da0 6005a2c8 
00f84da4 60065600 600319b0 600316e8 00000080 
00f84db4 00000000 03ba3500 00000000 03ba3504 
00f84dc4 00000000 00000000 00000000 00000000 
00f84dd4 00000000 00000000 00000000 00000000 
00f84de4 00000000 00000000 00000000 00000000 

tôi không thể tìm thấy bất kỳ tài liệu tham khảo để địa chỉ của M() phương pháp (012604f8)

Vậy câu hỏi là liệu bảng phương pháp chứa tham chiếu đến phi phương pháp ảo? Chúng được lưu trữ ở đâu?

+1

012604f8 là địa chỉ của mô tả siêu dữ liệu của phương pháp. Bảng phương thức chứa nhiều hơn chỉ các địa chỉ của phương thức. 4 phương thức ảo được thừa hưởng từ Object bắt đầu tại 00f84da0 (6005a2c8 vv), hai phương thức của lớp chưa được jitted. –

+0

Cảm ơn bạn, Hans. Phương thức M() đã được biên dịch JIT. Nhưng không có mục nhập trong bảng phương thức cho M(). – dmitryo

Trả lời

7

enter image description here

Nhờ một trong những đồng nghiệp của tôi đã đưa ra ánh sáng cho câu hỏi của tôi. Nó chỉ ra rằng con trỏ phương pháp được đặt tại offset offsets liên quan đến con trỏ bảng phương pháp

Các vấn đề liên quan