Почему VS2005 пропускает выполнение строк при отладке управляемого C ++ без оптимизации? - PullRequest
0 голосов
/ 28 апреля 2010

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

(очень) упрощенная версия кода выглядела бы так (я знаю, что это выглядит как полноценная нативная функция, просто предположим, что в некоторых местах выполняются управляемые вещи):

int somefunction(ptrHolder x)
{
  // the accessptr method returns a native pointer
  if (x.accessptr() != nullptr) // I tried this with nullptr, NULL, 0)
  {
    try
    {
      x->doSomeNativeVeryImportantStuff(); // or whatever, doesn't matter
    }
    catch (SomeCustomExceptionClass &)
    {
      return 0;
    }
  }

  SomeOtherNativeClass::doStaticMagic();

  return 1;
}

Я скомпилировал этот код без оптимизации, используя флаг / clr (VS.NET 2005, SP2), и при запуске его в отладчике я получаю оператор if, так как указатель фактически равен нулю, я не вводю if Удивительно, но курсор сразу переходит к оператору return 1, полностью игнорируя метод doStaticMagic () !!!

Глядя на ассемблерный код, я вижу, что он действительно переходит непосредственно к этой строке. Если я заставлю отладчик войти в блок if, я также перейду к оператору return 1 после нажатия F10.

Есть идеи, почему это происходит?

Спасибо, Ariel

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

Может ли это быть функцией Just My Code в VS2005? По умолчанию включено.

Из MSDN:

Иногда, пока вы отлаживаете, вы можете посмотреть только на код, который вы написали и игнорировать другие код, такой как системные вызовы. Ты можешь сделать это с отладкой Just My Code. Просто Мой код скрывает не пользовательский код, так что он не появляется в отладчике окна. Когда вы шагаете, отладчик проходит через любой не пользовательский код, но не останавливается в этом.

Различать код пользователя («Мой код») из не-пользовательского кода, просто мой код выглядит в трех вещах: файлы DBG, файлы PDB, и оптимизация.

1 голос
/ 28 апреля 2010

Вы пытались проверить, что код на самом деле испускается для SomeOtherNativeClass :: doStaticMagic (); линия? Возможно, компилятор не может найти его (или находит пустую функцию или что-то в этом роде) и поэтому пропускает ее.

Вторая идея: возможно, вы сравниваете две вещи, которые нельзя сравнить с помощью nullptr. Таким образом, вы получаете исключение, которое перехватывается и заставляет вас выйти из метода напрямую.

...