Точка останова VisualStudio запускается без выполнения фактической строки

#c #visual-studio-2019 #unreal-engine4

#c #visual-studio-2019 #unreal-engineer4

Вопрос:

У меня есть проект на Unreal Engine 4, и я отлаживаю код игры в Visual Studio 2019. В некоторых случаях достигается точка останова, но я полагаю, что код на самом деле не выполняется. Не могли бы вы, пожалуйста, рассказать мне, как это возможно?

 1   void UTrace::DrawDebug()
2   {
3       for (TPair<Vector2DTuple, int> edge : EdgesMap)
4       {
5           Vector2DTuple vertices = edge.Key;
6           FVector source = FVector(*vertices.Key, 0.f);
7           FVector target = FVector(*vertices.Value, 0.f);     
8
9           DrawDebugLine(GetWorld(), source, target, FColor::Black, false, -1.f, -1, 3.f);
10          UE_LOG(LogTemp, Warning, TEXT("%f %f %f"), source.X, source.Y, source.Z);
11          UE_LOG(LogTemp, Warning, TEXT("%f %f %f"), target.X, target.Y, target.Z);
12          UE_LOG(LogTemp, Warning, TEXT("-------"));
13      }
14  }
  

У меня есть точка останова в строках 9 и 11. Во время выполнения в игровом режиме после заполнения карты ребер каким-либо элементом достигается точка останова в строке 9.
В этот момент переменные кажутся неинициализированными.

локальные переменные в точке останова попадают в первый раз

Затем я нажимаю F5, чтобы продолжить программу, и точка останова снова нажата в строке 9 (не в строке 11, как я бы предположил). И одна из переменных инициализирована, а другая нет.

локальные переменные в точке останова нажаты во второй раз

Затем продолжайте программу, и точка останова снова будет нажата в строке 9, и до сих пор UE_LOG не выполнялся.

локальные переменные в точке останова нажаты в третий раз

После этого я продолжаю программу, и, наконец, достигается точка останова в строке 11, и в консоли появляется один журнал с правильно инициализированными переменными (x = 150, y = 650).

Вопросы:

  • Это какое-то странное поведение Visual Studio или это какая-то ошибка в моем коде?
  • Как я могу определить, действительно ли строка выполнена?
  • Это как-то связано с инициализацией локальной переменной?

Наблюдения:

  • Эта странная точка останова возникает только в строке с первым методом отладки Draw. Если я помещу другой вызов несколькими строками выше, чем это происходит при предыдущем вызове.
  • Карта границ коллекции содержит только один элемент (таким образом, цикл имеет только одну итерацию для одного вызова DrawDebug)
  • Метод DrawDebug вызывается только из метода OnTick (он не вызывается из какого-либо конструктора)

Комментарии:

1. Это возможно, если вы отлаживаете код сборки выпуска

2. Вы захотите использовать конфигурацию отладки, если вы создали движок самостоятельно, тогда вы могли бы использовать DebugGameEditor. Это означает, что все игровые модули скомпилированы без оптимизации. Я думаю, что конфигурация для предварительно созданной версии просто называется Debug.

3. Спасибо, это действительно произошло из-за неправильной конфигурации! Это открывает другой вопрос. Есть ли причина в использовании debugger в конфигурации разработки? Могу ли я полагаться на некоторые части или поведение полностью не определено?