Подтвердить что ты не робот

Как просмотреть поля поддержки для свойств С# в отладчике Visual Studio?

Отладчик Visual Studio иногда попадает в состояние, в котором он не может оценить выражения. Это предотвращает отображение значений свойств. Например, если вы смотрите на поток, в котором верхняя часть стека сообщает [Managed to Native Transition], и вы просматриваете любые свойства через, скажем, ссылку this в окне "Локали", все они будут сообщать Cannot evaluate expression because a native frame is on top of the call stack.

Вы все еще можете проверять поля, когда отладчик находится в этом состоянии, потому что это не требует выполнения кода. (Свойства причины становятся недоступными, так как отладчик фактически запускает getter для получения значения. Он не может этого сделать, если поток, в котором вы находитесь, похоронен в некотором неуправляемом коде.)

К сожалению, генерируемые компилятором поля, которые сохранили значение для свойств С# auto, не отображаются в отладчике. (Это поля с именами типа <MyProperty>__BackingField.)

Я попытался включить параметр "Показывать необработанную структуру объектов в окне переменных" в параметрах отладчика, но, похоже, это не помогает с этими скрытыми полями.

Есть ли способ заставить отладчик показать мне поля, которые спрятал компилятор?

Или, наоборот, есть ли другой способ узнать значение поля автосохранения, когда обычная оценка свойств недоступна?


Примечание: переписывание кода для использования свойства, реализованного вручную, в данном случае не является опцией, поскольку свойство, значение которого я хочу знать, находится в библиотеке Microsoft. (В частности, Open XML SDK.) Это свойство auto, и я не могу его изменить.

Также обратите внимание на: просто разрешить выполнение кода немного, чтобы он мог вернуться с нативного кода, переход не является вариантом, потому что по какой-то причине код ввел какой-то жесткий занятый цикл - он потребляет ядро ​​процессора и никогда не возвращается. (Я пытаюсь диагностировать эту проблему, поэтому я пытаюсь выяснить, каковы значения свойств объекта. Я пытаюсь получить точную картину того, как она попадает в это состояние.)

Еще одно примечание: это не дубликат Признание поля поддержки в свойстве auto - мой вопрос очень конкретно о чтении значение при отладке.

Кроме того, в случае, если это уместно, я отлаживаю код удаленно, поскольку он работает с ролью Azure. Проблема возникает только в этой среде. Это, как я могу сказать, исключает встроенную отладку, поэтому я не могу даже взглянуть на бит кода, который застрял в цикле - мне нужно попытаться сделать вывод, что это было, если посмотреть на управляемый код, который запускался непосредственно перед тем, как он исчез в этой кроличьей дыре.

4b9b3361

Ответ 1

Скажем, у вас есть класс с свойством, которое вы хотите посмотреть в отладчике:

public class C
{
    // ...
    public int I { get; set; }
    // ...
}

Я считаю, что следующее выражение часов будет работать (c - это экземпляр класса c):

c.GetType().GetField("<I>k__BackingField",
    BindingFlags.Instance | BindingFlags.NonPublic).GetValue(c)

Не очень удобно, я знаю, но лучше, чем ничего.