簡體   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