[英]How can Visual Studio C++ debugger be showing values of local variables that are at odds with another frame?
我正在使用 C++ 在 UE5 中构建游戏。 如果您可以访问虚幻引擎源代码(在此处获取),我将在此行上打一个断言: https://github.com/EpicGames/UnrealEngine/blob/d9d435c9c280b99a6c679b517adedd3f4b02cfd7/Engine/Plugins//Runtime/StateTree源/StateTreeModule/Private/StateTreeExecutionContext.cpp#L682
当我查看 Visual Studio 调试器时,它显示断言错误:
Array index out of bounds: 65533 from an array of size 5
但是当我查看 Locals window 时,该数组索引(存储在CurrentStatus.State.Index
中)的值为2
,而不是65533
。 怎么会这样?
相关源代码为:
for (FStateTreeHandle Handle = CurrentStatus.State; Handle.IsValid(); Handle = StateTree->States[Handle.Index].Parent)
{
const FBakedStateTreeState& State = StateTree->States[Handle.Index];
...
}
在调用StateTree->States[Handle.Index]
时,断言第一次通过 for 循环命中,因此Handle.Index
获得的值CurrentStatus.State.Index
(即2
)。
如果我单击它正在验证数组索引的框架,则 Locals window 确实显示Index
is 65533
。
在此处查看此问题的屏幕截图: Visual Studio 调试器
根据此屏幕截图,变量Handle
已被优化掉,但似乎已优化为具有错误的值。 我无法想象这是 C++ 编译器中的错误,那还能是什么?
原来对这个问题的评论给了我正确的线索:
最重要的是,您不能简单地调试优化代码,并期望调试器根据编译器完成的优化进行自我调整。
当我使用 UE5 的非优化版本进行调试时,我很快发现了问题,并且CurrentStatus.State.Index
实际上是65533
。
如果其他人遇到这种情况,仅在 Visual Studio 项目中为您的游戏使用“DebugGame Editor”配置是不够的。 该配置仅编译您的游戏代码而不进行优化,引擎仍使用优化代码运行。
要在没有优化代码的情况下运行引擎,您需要从源代码构建它并使用“调试编辑器”Visual Studio 配置来禁用优化。 然后,您可以通过在调试部分下的项目属性页中更改它在游戏的 Visual Studio 项目中使用的 UE exe 的路径来运行游戏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.