Получение возвращаемого значения метода в отладчике VS
Можно ли получить возвращаемое значение метода в отладчике Visual Studio, даже если это значение не назначено локальной переменной? Например, я отлаживаю следующий код:
public string Foo(int valueIn)
{
if (valueIn > 100)
return Proxy.Bar(valueIn);
else
return "Not enough";
}
Поскольку я не устанавливаю никаких локальных переменных в Foo и предполагаю, что я не устанавливаю точку останова в любом вызове Foo, есть ли способ увидеть, что такое возвращаемое значение, если у меня есть точка останова внутри Foo ( или другим способом)? У меня нет большого опыта работы с окнами Autos или Intermediate, поэтому я не уверен, что это даже допустимый вариант.
Ответы
Ответ 1
Вы можете установить точку останова в Foo, открыть ближайшее окно и запустить следующую команду:
? Foo(valueIn)
Это будет напечатать возвращаемое значение в окне Immediate.
Вы также можете скопировать выражение и вставить его в окно просмотра, хотя я бы сделал это, только если я уверен, что вызов не имеет побочных эффектов (в противном случае вы можете получить запутанные результаты).
Ответ 2
Вы всегда можете переключиться на просмотр дизассемблера и выполнить отдельные инструкции. Возвращаемое значение будет находиться в @eax (или @rax) непосредственно перед выполнением инструкции "ret".
Ответ 3
Нет, я не знаю, как это сделать. Я бы поставил точку останова в вызывающем абоненте и посмотрел на возвращаемое значение.
Ответ 4
Вы также можете выделить любое выражение в отладчике и щелкнуть правой кнопкой мыши → быстрый просмотр. Это выполнит выражение (предположим, что оно действительно) и даст вам значение.
Ответ 5
В Visual Studio 2013 теперь есть возможность в окне Autos отображать последнее значение, возвращаемое функцией, облегчая необходимость повторного запуска в окне вывода или вводить временную переменную:
http://blogs.msdn.com/b/visualstudioalm/archive/2013/06/27/seeing-function-return-values-in-the-debugger-in-visual-studio-2013.aspx
Ответ 6
Вы всегда можете использовать свой блок часов для оценки вызовов функций.
Foo (valueIn);
Это будет работать, только если ваш Proxy.Bar(valueIn) не зависит от времени.
Ответ 7
Обходным путем является использование переменной результата в стиле Паскаля:
public string Foo(int valueIn)
{
string result;
if (valueIn > 100)
result = Proxy.Bar(valueIn);
else
result = "Not enough";
return result;
}
Это хороший стиль, на мой взгляд, для более длинных функций. Для очень коротких, подобных приведенным выше, это можно считать излишним, но проблема с отладчиком оборачивается.
Ответ 8
Ответ подобного вопроса там:
В VS 2013 вы можете добавить переменную $ReturnValue к часам. Он содержит фактическое значение returnvalue из функции.
Кредит Джеспер Дженсен.