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

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

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

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

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

Ответ 1

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

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

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


Обновление для VS2015: boo! к сожалению, он не находится в VS2015 (devenv v14)

Ответ 3

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

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

Statement Visualization

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

Ответ 4

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

Для тех, у кого есть опыт отладки собственного кода С++ или 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

Ответ 5

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

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

В этом ответе также указано, что эта функциональность не работает в VS2015. Это не совсем правда. На https://msdn.microsoft.com/en-us/library/dn323257.aspx есть следующее примечание:

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

Я тестировал это в VS2015 Enterprise:

  • С устаревшими оценщиками выражения отключены: только $ReturnValue1 работает
  • При использовании устаревших оценщиков выражений: $ReturnValue и $ReturnValue1 работают

Ответ 6

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

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

Итак, это нормально для:

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

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

но не для:

int go(){return 100 * 99;}

Ответ 7

Старый трюк из pre.Net days: откройте окно "Регистры" и посмотрите на значение регистра EAX, это содержит возвращаемое значение последней вызванной функции.

Ответ 8

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

Ответ 9

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

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

NB. Я понимаю, что ваша проблема давно решена или забыта. Тем не менее, я получил этот удар, когда я искал Google по тому же вопросу, поэтому он заслужил обновление. Это означало немного шутки.

Ответ 10

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

Чтобы процитировать John Skeet ниже:

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

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

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

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

Ответ 11

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

someTableAdapter.getSomeData();

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

Ответ 12

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

Ответ 13

Я хотел расшифровать ответ @PascalK, чтобы заставить его работать в VS2015, потому что есть скрытая функция, которая не документирована на https://msdn.microsoft.com/en-us/library/dn323257.aspx.

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

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

Ответ 14

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

Ответ 15

Откроется окно "Отладка-Авто". Он не покажет фактическое возвращаемое значение, но покажет, что было оценено в операторе return.

Ответ 16

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

Ответ 17

Да, перейдя на VB.NET.; P (вы просто сказали "Visual Studio".;)

Пока я помню (из VB через все версии VB.NET), вы можете просто запросить имя функции. Он "функционирует" как локальная переменная, которая неявно объявляется в начале функции, а ее текущее значение также используется как возвращаемое значение всякий раз, когда функция выходит из невозвратного утверждения (т.е. функция выхода или просто падает) и, конечно же, когда используется оператор Return, он также устанавливается в выражение "Возвращаемое выражение". Точно так же, как локальная переменная, ее значение может быть проверено в любой точке выполнения внутри функции (в том числе после выполнения Операции возврата). С# не имеет этого и должен.

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

Ответ 18

Я знаю, что это старый вопрос, но поскольку принятый ответ не работает должным образом с 2015 года, я добавлю обходной путь.

Поместив точку останова в последнюю строку метода, и нажатие f10 поместит все выражения возвращаемого значения в окно locals.

Ответ 19

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

Ответ 20

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

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

вернуть someTableAdapter.getSomeData();

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

someTableAdapter.getSomeData()

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

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