VIsual Studio - Как изменить возвращаемое значение метода в отладчике? - PullRequest
9 голосов
/ 19 января 2009

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

   private int myMethod_1()
   {
      return 12;
   }

   private int myMethod_2()
   {
      return someCall( someValue );
   }

Ну, чтобы воссоздать ошибку, мне часто приходится менять значения на лету. Здесь я хотел бы посмотреть, что произойдет, когда myMethode_1 вернет ноль. То же самое для myMethod_2.

Есть ли способ сделать это без изменения кода ? То, что я хотел бы сделать, это разместить точку останова на обратной строке (или на закрывающей скобке) и ввести новое возвращаемое значение.

Примечание. Я использую Visual Studio 2005 и Visual Studio 2008.

Спасибо!

Ответы [ 6 ]

4 голосов
/ 19 января 2009

Для тех, кто ищет решение этой проблемы в VB.NET:

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

Изменение значения: просто нажмите на эту подсказку, измените значение и нажмите ввод.

Visual Studio очень классная!

Примечание. Я тестировал его в VB.NET на Visual Studio Team System 2008. Только что попробовал использовать C #, но он не работает ...: - (

4 голосов
/ 19 января 2009

Возвращаемые значения из функций обычно возвращаются в регистр EAX.

Если вы установите точку останова только в конце функции, тогда есть вероятность, что изменение EAX изменит возвращаемое значение. Вы можете изменить и просмотреть любой регистр в visual studio, просто написав его имя в окне просмотра.
Это может привести к сбою, если у вас включена оптимизация или даже если функция выглядит просто, как return 12. это, вероятно, также не сработает, если вы возвращаете что-то, что не помещается в 32-битный регистр. По крайней мере, стоит попробовать.

1 голос
/ 19 января 2009

Что вам нужно, это издеваться. Оформить заказ насмешками, такими как Rhinomock, Moq или Typemock.

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

1 голос
/ 19 января 2009

Не думаю.
Вам понадобится временная переменная в вызываемой или вызывающей стороне, чтобы получить указатель на значение для его изменения в окне IDE Debugger / QuickWatch. Таким образом, самый простой и быстрый способ сделать это - прокомментировать существующий код и внести временное изменение в debug-what-if.

либо

private int myMethod_1()
{
  var x = 12;
  return x;
}

или

private int myMethod_2()
{
  var y = someCall( someValue);
  return y;
}

Не вижу смысла в том, чтобы "избегать изменения кода", чтобы сделать это. Если я FUBAR, я делаю проверку, и мы снова золото.

0 голосов
/ 19 января 2009

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

   private int myMethod_1()
   {
      return 12;
   }
//call would be something like this
int x = myMethod_1();
//Here you can change the value after the execution of the above line.

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

0 голосов
/ 19 января 2009

Я думаю, вы можете сделать это в Visual Studio, но мне это кажется грязным.

Я думаю, что вы действительно должны изучать фреймворк модульного тестирования и макет, чтобы вы могли подделать вывод myMethod_2 как 0 и посмотреть, как он влияет на ваш код. ИМО. Таким образом, вы можете оставить проверку возврата 0 в модульном тесте, чтобы убедиться, что уродливая ошибка не высунется снова.

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