Могу ли я узнать возвращаемое значение перед возвратом во время отладки в Visual Studio?
возьмите следующую функцию:
DataTable go() {
return someTableAdapter.getSomeData();
}
когда я установить точку останова в этой функции, есть возможность проверить возвращаемое значение? go() непосредственно связан с datagrid в .aspx страница.
единственный способ проверить возвращаемый datatable-это использовать временную переменную. Однако, это немного неудобно. Разве нет другого пути?
20 ответов:
насколько мне известно, нет. Обратите внимание, что если вы do добавьте переменную, она будет удалена компилятором в сборках выпуска в любом случае...
обновление: эта функция была добавлена в VS2013. Вы можете увидеть возвращаемые значения в окнах autos или использовать
$ReturnValueв окне watch/immediate.значение можно увидеть только непосредственно после возвращения из функции, поэтому самый простой способ получить к нему доступ-это поставить точку останова вызов функции и шаг над (F10) вызовом.
обновление для VS2015: boo! к сожалению, это не похоже на VS2015 (devenv v14)
Это можно сделать в Visual Studio 2013 с CLR 4.5.1 согласно сайту обратной связи с клиентами. Он не был доступен в предыдущих версиях для C#.
(Visual Studio 2008 и ранее поддерживал его для VB.NET. он всегда был доступен для разработчиков C / C++.)
Я согласен, что это очень полезная вещь: не только видеть возвращаемое значение метода, прежде чем выйти из него, но и видеть возвращаемое значение методов, которые я только что перешагнул. Я реализовал его как часть коммерческого расширение для Visual Studio под названием " OzCode".
с его помощью вы можете просматривать возвращаемые значения метода прямо в редакторе кода, как своего рода HUD-дисплей:
для получения дополнительной информации, пожалуйста, см. видео.
согласно Microsoft, нет способа надежно реализовать это с помощью управляемого кода. Это проблема, о которой они знают и над которой работают:
для тех, у кого есть опыт отладки собственного кода C++ или VB6, вы, возможно, использовали функцию, в которой возвращаемые значения функции предоставляются вам в окне Autos. К сожалению, эта функция не существует для управляемого кода. Хотя вы можете обойти эту проблему, назначив возвращаемые значения локальному переменная, это не так удобно, потому что это требует изменения кода. В управляемом коде намного сложнее определить, какое возвращаемое значение функции вы перешагнули. Мы поняли, что не можем последовательно делать правильные вещи здесь, и поэтому мы удалили эту функцию, а не дали вам неправильные результаты в отладчике. Тем не менее, мы хотим вернуть это для вас, и наши команды CLR и отладчика рассматривают ряд потенциальных решений этой проблемы. К сожалению, это не будет частью Visual Studio 11.
согласно принятому в настоящее время ответу Марка Гравелла:
этой функциональность была добавлена в Visual Studio 2013. Вы можете увидеть возвращение значения в окнах autos или использовать $ReturnValue в watch / immediate окно
в этом ответе также указано, что эта функция не работает в Visual Studio 2015. Это не (совсем) верно. На Проверьте возвращаемые значения вызовов метода там это следующее примечание:
У вас должны быть включены устаревшие оценщики выражений для $ReturnValue для признания (Tools / Options / Debugging / Use the legacy C# and VB expression evaluators). В противном случае, вы можете использовать $ReturnValue1.
Я тестировал это в Visual Studio 2015 Enterprise:
- при отключенных оценщиках устаревших выражений:только $ReturnValue1 работает
- с включенными оценщиками устаревших выражений:и $ReturnValueи $ReturnValue1 работа
Если вы идете в меню инструменты→ опции, 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 года, я предлагаю вам waaaaaa...
...аааа. И вуаля! Только для вас, MS выпустила последнюю Visual Studio 2013 где это функция по умолчанию доступна из меню во время работы в режиме отладки (меню Debug→ Windows→ автомобили).
есть много обходных путей, но ни один не кажется удовлетворительным.
чтобы процитировать Джона Скита ниже (комментарий к теперь удаленному ответу):
по-прежнему выглядит неудобно для меня - особенно если вы не знаете, какие возвращаемое значение, которое вам понадобится перед началом отладки. Я действительно не хочу иметь временный переменная загромождает мой код каждый пора мне хоть что-нибудь вернуть.Т
теоретически отладчик может иметь
return-переменная. В конце концов: это просто переменная в стеке:unsafe { int * sp = stackalloc int[1]; try { return a+b; } finally { Trace.WriteLine("return is " + *(sp+3)); } }поэтому считайте это запросом функции для Visual Studio.
единственный способ, который я знаю, это разместить точку останова на обратной линии, а затем вызвать Быстрый Просмотр окно и введите возвращаемое выражение:
someTableAdapter.getSomeData();но это работает только в том случае, если вызов не изменяет состояние любого объекта (так как будет второй вызов того же метода, когда вы возобновите выполнение).
Я хотел расширить на ответ Паскаля для получения этой работы в Visual Studio 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 и т. д.
открытие окна Debug → Autos позволяет вам закрыть. Он не будет показывать фактическое возвращаемое значение, но он покажет, что было оценено в инструкции return.
Да, переключившись на VB.NET. ;P (вы только что сказали "Visual Studio". ;)
до тех пор, как я помню (от Visual Basic через все версии VB.NET), вы можете просто запросить имя функции. Он "функционирует" как локальная переменная, которая неявно объявляется в начале функции, и ее текущее значение также используется в качестве возвращаемого значения всякий раз, когда функция выходит через средство оператора невозврата (т. е.
Exit Functionили просто проваливается) и конечно же, при возвращении используется оператор.Он также установлен в выражение оператора return. Как и локальная переменная, ее значение может быть проверено в любой момент выполнения внутри функции (в том числе после выполнения оператора return). C# не имеет этого и должен.
что мало VB.NET особенность (плюс
Exit Functionоператор, который он включает-другая функция C# не имеет и должна) очень полезна в виде защитное Программирование Я практикую там, где я всегда инициализируйте имя функции со значением failure / default в качестве первого оператора. Затем, в любой точке отказа (что обычно происходит гораздо чаще, чем точки успеха), я могу просто вызватьExit Functionоператор (т. е. без необходимости дублировать выражение failure / default или даже имя константы/переменной).
принятый ответ не работает с Visual Studio 2015, но, поставив точку останова на последней строке метода и клавишей F10, он поместит все выражения возвращаемого значения в окно locals.
вы можете попробовать, чтобы выбрать
"someTableAdapter.getSomeData();"правой кнопкой на нем, и перейти к Быстрый Просмотр.
перетащите возвращаемое выражение в окно наблюдения.
например, в заявлении
return someTableAdapter.getSomeData();перетащить
someTableAdapter.getSomeData()в окно смотреть, и вы увидите значение.
Вы можете сделать это для любого выражения.

Comments