[問題] C++ 變數無法正常創建

作者: handofn0xus (你真是糟糕的小焰)   2024-07-10 16:52:46
在Visual Studio 2008編寫MFC GUI時遇到一個莫名其妙的神奇問題
首先上圖:
https://i.imgur.com/eGBVQ.jpeg
我在這個function創建一個變數byWTF
之前是別的名字,但我後來故意改一個沒用過的變數名稱保證這個名稱不可能被用過
然後實際在debug時,發現這個變數絕對不會被創建
導致後續出現一系列非預期錯誤
從圖中也能看到
byWTF早就被宣告
上一行執行也給他賦值了
但是把他Add watch就發現這個變數根本沒被放到記憶體
然後後面實際要用到他就直接閃退報錯了
所有其他變數都能正常宣告創建
就他跟我之後測試用建的所有變數都無法正常創建
我這邊到底是做錯了甚麼?真的毫無頭緒
更新: Debug build可以正常宣告, Release build就會出問題
240711 AM09:50更新:
我把整個release資料夾砍掉 再build
雖然byWTF依舊無法watch 但不會再出錯crash了
作者: pigyuanncu   2024-07-10 17:52:00
請問你所謂的實際要用他是在迴圈外用還是迴圈內,就如你現在提供的程式碼以及敘述,byWTF可能被編譯器optomized out,所以你也找不到這個變數,但是你如果說你有實際存取這個變數,他應該就會存在於這個function call的stack memory裡,但用debugger找不找得到該變數是另外一回事(取決於optimization level)
作者: james732 (好人超)   2024-07-10 18:03:00
release build會做最佳化,有些變數會消失掉
作者: pigyuanncu   2024-07-10 18:34:00
我覺得如果可以的話,看你要不要貼整段的程式碼,感覺起來你的crash可能不是東西不見了,如果是東西不見了,最爛的workaround可能會是讓東西都變成volatile,但程式可能就會變很慢
作者: firejox (Tangent)   2024-07-10 19:52:00
vbyRawData是放在哪裡
作者: kdjf (我抓得到什麼呢?)   2024-07-10 19:53:00
這樣形式的變數變成直接存取/沒給位置很正常啊,找個可以記憶體管理和安全性的框架找看看是不是踩未定義行為吧
作者: notBeing (read and be read)   2024-07-10 20:26:00
Breakpoint 打在210行 試看看能不能watch , 先簡化問題試試
作者: ctrlbreak   2024-07-10 22:31:00
清專案重編看看 遇到過幾次類似情況 也是release後發生
作者: firejox (Tangent)   2024-07-11 12:41:00
那如果把vbyRawData 用參數的方式會有同樣的問題嗎我要問的是vbyRawData的scope可能編譯器認為 vbyRawData 都是0,然後有賦值的地方也看不到所以optimize時就不見了
作者: Dracarys (MayShowGunMore)   2024-07-11 21:01:00
有可能debug/release builds ABI incompatible 然後link錯看不懂什麼叫private全域變數,可以寫個minimal reproducer放compiler explorer嗎
作者: firejox (Tangent)   2024-07-11 21:28:00
全域變數的話 volatile 應該能解決
作者: wulouise (在線上!=在電腦前)   2024-07-11 22:34:00
這個變數會被optimized out的吧..只有loop內用不能watch很正常,要看的是實際上那邊crash
作者: closer76 (克樓瑟)   2024-07-12 00:38:00
同意應該是被最佳化掉了,因為是從 vector 取出的,編譯器可以直接算出資料所在位置。不過我另外有個問題:為什麼要用 VS2008? XD
作者: ctrlbreak   2024-07-12 19:27:00
release版看不到正常, 不放心就輸出一份asm檔看看邏輯符不符合需求XD
作者: lc85301 (pomelocandy)   2024-07-12 22:38:00
看 asm 沒必要吧,debug build 就可以了

Links booklink

Contact Us: admin [ a t ] ucptt.com