Могу ли я узнать возвращаемое значение перед возвратом во время отладки в Visual Studio? - PullRequest
358 голосов
/ 06 ноября 2008

Возьмите следующую функцию:

DataTable go() {
    return someTableAdapter.getSomeData();
}

Когда я устанавливаю точку останова в этой функции, есть ли возможность проверить возвращаемое значение? go() напрямую связан с сетью данных на странице .aspx.

Единственный способ проверить возвращаемую таблицу данных - использовать временную переменную. Однако это немного неудобно. Разве нет другого пути?

Ответы [ 20 ]

244 голосов
/ 06 ноября 2008

Не то, что я знаю. Обратите внимание, что если вы делаете добавление переменной, она все равно будет удалена компилятором в сборках релиза ...

Обновление: Эта функциональность была добавлена ​​к VS2013 . Вы можете увидеть возвращаемые значения в окнах autos или использовать $ReturnValue в окне просмотра / непосредственного просмотра.

Значение можно увидеть только после возвращения из функции, поэтому самый простой способ получить к нему доступ - это поставить точку останова на вызов функции и перешагнуть (F10) вызов.


Обновление для VS2015: boo! к сожалению, его нет в VS2015 (devenv v14)
Обновление для VS2017: он вернулся. (devenv v15)

58 голосов
/ 15 сентября 2010

Это можно сделать в Visual Studio 2013 с CLR 4.5.1 в соответствии с сайтом отзывов клиентов . Он не был доступен в предыдущих версиях для C #.

(Visual Studio 2008 и более ранние версии поддерживали его для VB.NET. Он всегда был доступен для разработчиков на C / C ++.)

24 голосов
/ 18 ноября 2011

Я согласен, что это очень полезная вещь: не только видеть возвращаемое значение метода перед тем, как выйти из него, но и видеть возвращаемое значение методов, которые я только что перешагнул. Я реализовал его как часть коммерческого расширения Visual Studio под названием " OzCode ".

С его помощью вы можете просматривать возвращаемые значения метода прямо в редакторе кода, как своего рода HUD-дисплей:

Statement Visualization

Для получения дополнительной информации, см. это видео .

22 голосов
/ 17 июня 2012

Согласно Microsoft, нет способа надежно реализовать это с помощью управляемого кода. Это проблема, о которой они знают и над которой работают:

Для тех, у кого есть опыт отладки нативного кода C ++ или VB6, вы, возможно, использовали функцию, в которой возвращаемые значения функции предоставляются для вас в окне Autos. К сожалению, эта функция не существует для управляемого кода. Хотя вы можете обойти эту проблему, назначив возвращаемые значения локальной переменной, это не так удобно, так как требует изменения вашего кода. В управляемом коде намного сложнее определить, какое возвращаемое значение функции вы перешагнули. Мы поняли, что не можем последовательно делать правильные вещи, и поэтому удалили эту функцию, вместо того, чтобы давать вам неправильные результаты в отладчике. Тем не менее, мы хотим вернуть это вам, и наши команды CLR и Debugger рассматривают ряд потенциальных решений этой проблемы. К сожалению, это не будет частью Visual Studio 11.

https://connect.microsoft.com/VisualStudio/feedback/details/597933/add-a-return-pseudo-variable-to-the-visual-studio-debugger-for-net-code

18 голосов
/ 18 марта 2016

Согласно принятому в настоящее время ответу Марка Гравелла:

Эта функциональность была добавлена ​​в Visual Studio 2013 . Вы можете увидеть возвращение значения в окнах авто или используйте $ ReturnValue в часы / немедленно окна

В этом ответе также указывалось, что эта функция не работает в Visual Studio 2015. Это не совсем верно. На Проверьте возвращаемые значения вызовов методов есть следующее примечание:

У вас должны быть включены устаревшие оценщики выражений, чтобы $ ReturnValue было распознано (Инструменты / Параметры / Отладка / Использовать устаревшие оценщики выражений C # и VB ). В противном случае вы можете использовать $ ReturnValue1 .

Я проверял это в Visual Studio 2015 Enterprise:

  • С устаревшими оценщиками выражений: только $ ReturnValue1 работает
  • С включенными оценщиками устаревших выражений: оба $ ReturnValue и $ ReturnValue1 работа
13 голосов
/ 29 марта 2011

Если вы зайдете в меню Инструменты Параметры , IntelliTrace и измените настройку для сбора событий и информации о вызовах.

Вы можете вернуться к предыдущему событию вызова ( Ctrl + Shift + F11 ) и увидеть временное значение, возвращаемое из вызова метода в autos окно как дочерний элемент имени метода.

Это не показывает возвращаемое значение для метода, в котором вы находитесь. Это просто показывает возвращаемое значение последнего метода, вызванного в текущем методе.

Итак, это хорошо для

DataTable go(){return someTableAdapter.getSomeData();}

, поскольку показывает возвращаемое значение для someTableAdapter.getSomeData().

Но не для:

int go(){return 100 * 99;}
12 голосов
/ 30 октября 2012

Старый трюк с предыдущих дней .NET: откройте окно регистров и посмотрите значение регистра EAX. Содержит возвращаемое значение последней вызванной функции.

9 голосов
/ 06 ноября 2008

Выйдите из метода go () с помощью Shift-F11, а затем в окне отладки «Autos» отобразится возвращаемое значение вызова метода, который только что вытолкнул из стека (в данном случае, go () метод, который вы хотите). Это поведение в Visual Studio 2005; Я не использовал Visual Studio 2008, поэтому я не знаю, ведет себя ли он так же в этой версии.

7 голосов
/ 03 сентября 2014

Да, есть очень хороший способ. Одним существенным недостатком является то, что вам придется ждать 5, а может и 6 лет. Так как я вижу, что вы отправили в ноябре 2008 года, я предлагаю вам waaaaaa ...

... aaaait. И вуаля! Только для вас, MS выпустила последнюю версию Visual Studio 2013 , где эта функция по умолчанию доступна из меню при работе в режиме отладки (меню Отладка Windows Авто ).

5 голосов
/ 09 февраля 2009

Есть много обходных путей, но ни один не кажется удовлетворительным.

Цитировать Джона Скита ниже (комментарий к удаленному ответу):

Мне все еще кажется неудобным - особенно если вы не знаете, какие возвращаемое значение вам нужно прежде чем начать отладку. я действительно не хочу иметь временный переменная загромождает мой код каждый раз я когда-нибудь что-нибудь верну.t

Теоретически, отладчик может иметь return -вариант. В конце концов: это просто переменная в стеке:

unsafe {
  int * sp = stackalloc int[1];
  try {
    return a+b;
  }
  finally {
    Trace.WriteLine("return is " + *(sp+3));
  }
}

Так что считайте это запросом функции для Visual Studio.

...