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



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



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


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



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

655   20  

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-дисплей:

Statement Visualization

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

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

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

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

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

этой функциональность была добавлена в 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.

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

единственный способ, который я знаю, это разместить точку останова на обратной линии, а затем вызвать Быстрый Просмотр окно и введите возвращаемое выражение:

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

    Ничего не найдено.