Могу ли я узнать возвращаемое значение перед возвратом во время отладки в Visual Studio?

StackOverflow https://stackoverflow.com/questions/268048

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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


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

Другие советы

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

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

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

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

Визуализация операторов

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

По словам 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- код

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

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

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

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

Я протестировал это в Visual Studio 2015 Enterprise:

  • С отключенными устаревшими средствами вычисления выражений: Только $ReturnValue1 работает
  • С включенными устаревшими средствами вычисления выражений: и то , и другое $Возвращаемое значение и $ReturnValue1 работа

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

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

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

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

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

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

Но не для:

int go(){return 100 * 99;}

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

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

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

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

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

Чтобы процитировать слова Джона Скита ниже (прокомментируйте удаленный ответ):

  

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

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

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

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

Microsoft Visual C ++ использовал для этого, но Visual Studio не AFAIK ..: (

Единственный способ, которым я знаю, - это поместить точку останова в строку возврата, а затем вызвать окно Quick Watch и ввести возвращаемое выражение:

someTableAdapter.getSomeData();

Но это работает только в том случае, если вызов не изменяет состояние какого-либо объекта (так как будет повторный вызов того же метода, когда вы возобновите выполнение).

Я хотел бы остановиться на ответ PascalK за то, чтобы заставить его работать в Visual & nbsp; Studio & nbsp; 2015, поскольку в Проверка возвращаемых значений вызовов методов .

Если у вас есть вложенные вызовы функций, автоматически создаются псевдопеременные $ ResultValueX , где X обозначает порядок вызовов функций. Поэтому, если у вас есть вызов, такой как Multiply (Five (), Six ()) , создаются следующие псевдопеременные:

Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30

Вы также можете запросить оценку значения в промежуточном окне, если оно не устанавливает флаги или другие переменные, а только что-то возвращает.

Я думаю, что вы можете определить это, посмотрев регистр RAX в окне регистров (Debug / Windows / Registers). После выхода (SHIFT + F11) из функции проверьте регистр RAX. Я не знаю точно, но однажды вы могли проверить регистр (до .NET дней) и увидеть возвращаемое значение там. Это может быть даже комбинация RAX и RBX и т. Д.

Открытие отладки & # 8594; Окно авто приближает вас. Он не будет отображать фактическое возвращаемое значение, но он покажет, что было оценено в операторе возврата.

Да, переключившись на VB.NET. ; P (Вы только что сказали «Visual Studio».)

Насколько я помню (из Visual Basic до всех версий VB.NET), вы можете просто запросить имя функции. Это " функции " как локальная переменная, которая неявно объявляется в начале функции, и ее текущее значение также используется в качестве возвращаемого значения всякий раз, когда функция завершается с помощью средств оператора без возврата (т. е. Exit Function или просто проваливается) и, конечно же, когда используется оператор return.

Он также установлен на выражение оператора возврата. Как и локальная переменная, ее значение может быть проверено в любой точке выполнения внутри функции (в том числе после выполнения оператора return). C # не имеет этого и должен.

Эта небольшая функция VB.NET (плюс оператор Exit Function , который она включает - другая функция C # не имеет и должна) очень полезна в виде защитное программирование Я практикую, где я всегда инициализирую имя функции значением fail / default в качестве первого оператора. Затем в любой точке сбоя (которая обычно происходит гораздо чаще, чем точки успеха), я могу просто вызвать оператор Exit Function (т.е. без необходимости дублировать выражение сбоя / по умолчанию или даже константу / переменную). название).

Принятый ответ не работает должным образом с Visual & nbsp; Studio & nbsp; 2015, но, поместив точку останова на последнюю строку метода и нажав F10 , он поместит все выражения возвращаемого значения в окне locals.

Можно попытаться выбрать " someTableAdapter.getSomeData (); " , щелкнуть по нему правой кнопкой мыши и перейти к Быстрый просмотр .

Перетащите возвращаемое выражение в окно просмотра.

Например, в заявлении

return someTableAdapter.getSomeData();

перетаскивание

someTableAdapter.getSomeData()

в окно просмотра, и вы увидите значение.

Вы можете сделать это для любого выражения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top