繁体   English   中英

Visual Studio C++ 调试器如何显示与另一帧不一致的局部变量值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM