«[Легкая функция]» в стеке вызовов - PullRequest
17 голосов
/ 31 августа 2009

Я отлаживаю программу (VS2008), и я шагал по строкам кода. Я наткнулся на одну строку, где вызывается функция делегата, и попытался войти в нее. Однако вместо того, чтобы входить в метод, как я ожидал, метод был обойден, а отладчик вместо этого входит в то, что, как я полагаю, является функцией, вызываемой делегатом. В стеке вызовов строка, где я ожидал, что метод делегата будет отображаться серым цветом с текстом [Lightweight Function].

Что означает часть «Легкая функция»? Есть ли способ войти в эту функцию?

Ответы [ 3 ]

17 голосов
/ 31 августа 2009

Я полагаю, что облегченная функция ссылается на DynamicMethod , то есть тот, который генерируется во время выполнения, используется, а затем выгружается.

Этот пост в блоге связан с Iron Python, но информация должна быть полезной для любого проекта .NET: Просмотр испущенного IL . Автор показывает, как использовать отладчик более низкого уровня (windbg.exe) для просмотра этих «облегченных функций».

3 голосов
/ 28 октября 2010

Callstack для DynamicMethod (как в режиме отладки, так и в режиме выпуска):

[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

Чистый

[Легкая функция]

кадр можно наблюдать, когда вызывается делегат динамического метода .

3 голосов
/ 31 августа 2009

Похоже, это DynamicMethod . См. это для некоторого понимания.

Хотя я не уверен, что вступлю в динамический метод.

...