2009-08-31 55 views
13

Tôi đang gỡ lỗi một chương trình (VS2008) và tôi đã từng bước qua các dòng mã. Tôi đi qua một dòng nơi mà một chức năng đại biểu đã được gọi, và tôi đã cố gắng bước vào nó. Tuy nhiên, thay vì bước vào phương thức như tôi mong đợi, phương thức này bị bỏ qua, với trình gỡ rối thay vì bước vào cái mà tôi giả định là một hàm được gọi bởi đại biểu. Trong ngăn xếp cuộc gọi, dòng mà tôi mong đợi phương thức đại biểu được chuyển sang màu xám với văn bản [Lightweight Function]."[Chức năng nhẹ]" trong ngăn xếp cuộc gọi

Phần "Chức năng nhẹ" có nghĩa là gì? Có cách nào để bước vào chức năng này không?

+16

Geez, Visual Studio đầu tiên cho tôi biết rằng "mã này đã được tạo bởi một công cụ" và bây giờ nó gọi các chức năng của tôi "nhẹ"? Thật là một thái độ! :) –

+0

Kiểm tra cài đặt biên dịch của bạn, có thể tối ưu hóa được bật và các chức năng có thể được tối ưu hóa (được nêu) – CodingBarfield

Trả lời

12

Tôi tin rằng chức năng nhẹ đề cập đến một DynamicMethod, tức là một chức năng được phát ra khi chạy, được sử dụng và sau đó được tải xuống.

Bài đăng trên blog này có liên quan đến Iron Python, nhưng thông tin phải phù hợp với bất kỳ dự án .NET nào: Viewing Emitted IL. Tác giả cho bạn thấy cách sử dụng trình gỡ rối cấp thấp hơn (windbg.exe) để xem các "hàm nhẹ" này.

3

Có vẻ như đây là DynamicMethod. Xem this để biết một số thông tin chi tiết.

Tôi không chắc chắn về việc bước vào một phương pháp động.

2

callstack cho DynamicMethod (cả trong Debug và Release mode):

[Lightweight Function] 
[Native to Managed Transition] 
mscorlib.dll!System.Reflection.Emit.DynamicMethod.Invoke(object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture) + 0x199 bytes 

tinh khiết

[Lightweight Function]

khung có thể được quan sát thấy khi một đại biểu đến một phương pháp năng động là gọi là.

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