作者handofn0xus (你真是糟糕的小焰)
看板C_and_CPP
标题[问题] C++ 变数无法正常创建
时间Wed Jul 10 16:52:46 2024
在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了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.130.45.59 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1720601570.A.BC6.html
1F:→ pigyuanncu: 请问你所谓的实际要用他是在回圈外用还是回圈内,就07/10 17:52
最内层回圈
有用在if判断式 以及後续也会把这个值赋予给别的变数
这个变数没被创建 导致我後续vector部分index会无法正常赋值 进而造成crash
我用Debug build跑就完全正常 但一用release build就会死在这
2F:→ pigyuanncu: 如你现在提供的程式码以及叙述,byWTF可能被编译器op07/10 17:52
3F:→ pigyuanncu: tomized out,所以你也找不到这个变数,但是你如果说07/10 17:52
4F:→ pigyuanncu: 你有实际存取这个变数,他应该就会存在於这个functio07/10 17:52
5F:→ pigyuanncu: n call的stack memory里,但用debugger找不找得到该07/10 17:52
6F:→ pigyuanncu: 变数是另外一回事(取决於optimization level)07/10 17:52
7F:→ james732: release build会做最佳化,有些变数会消失掉07/10 18:03
但很显然他把我一个必须用到的变数给最佳化掉了...
8F:→ pigyuanncu: 我觉得如果可以的话,看你要不要贴整段的程式码,感07/10 18:34
https://i.imgur.com/GDt2v.png
这边是主要会用到byWTF的程式码
9F:→ pigyuanncu: 觉起来你的crash可能不是东西不见了,如果是东西不见07/10 18:34
10F:→ pigyuanncu: 了,最烂的workaround可能会是让东西都变成volatile07/10 18:34
11F:→ pigyuanncu: ,但程式可能就会变很慢07/10 18:34
12F:→ firejox: vbyRawData是放在哪里07/10 19:52
这个function进入前就会在别的function给值了
我在本文贴的那个断点处也检查过该vector里确实有我预期的所有资料
13F:推 kdjf: 这样形式的变数变成直接存取/没给位置很正常啊,找个可以记07/10 19:53
14F:→ kdjf: 忆体管理和安全性的框架找看看是不是踩未定义行为吧07/10 19:53
15F:→ notBeing: Breakpoint 打在210行 试看看能不能watch , 先简化问题07/10 20:26
16F:→ notBeing: 试试07/10 20:26
有试过在那两个vector初始化的下面那行加
byWTF = 0;
然而断点设在210 用F10去跑每一行的时候
会直接跳过byWTF=0; 也watch不到东西(Symbol not found)
17F:推 ctrlbreak: 清专案重编看看 遇到过几次类似情况 也是release後发生07/10 22:31
好 我再试试看 感谢
==
更新:我把整个release资料夹砍掉 再build
虽然byWTF依旧无法watch 但不会再出错crash了
18F:→ firejox: 那如果把vbyRawData 用参数的方式会有同样的问题吗07/11 12:41
参数是指?
19F:→ firejox: 我要问的是vbyRawData的scope07/11 12:43
该class的private全域变数 我是直接宣告在标头挡的class里的
20F:→ firejox: 可能编译器认为 vbyRawData 都是0,然後有赋值的地方也07/11 12:49
21F:→ firejox: 看不到所以optimize时就不见了07/11 12:49
22F:→ Dracarys: 有可能debug/release builds ABI incompatible 然後lin07/11 21:01
23F:→ Dracarys: k错07/11 21:01
24F:→ Dracarys: 看不懂什麽叫private全域变数,可以写个07/11 21:03
25F:→ Dracarys: minimal reproducer放compiler explorer吗07/11 21:03
26F:→ firejox: 全域变数的话 volatile 应该能解决07/11 21:28
27F:推 wulouise: 这个变数会被optimized out的吧..只有loop内用07/11 22:34
28F:→ wulouise: 不能watch很正常,要看的是实际上那边crash07/11 22:35
29F:推 closer76: 同意应该是被最佳化掉了,因为是从 vector 取出的,编译07/12 00:38
30F:→ closer76: 器可以直接算出资料所在位置。07/12 00:38
31F:→ closer76: 不过我另外有个问题:为什麽要用 VS2008? XD07/12 00:38
32F:推 ctrlbreak: release版看不到正常, 不放心就输出一份asm档看看逻辑07/12 19:27
33F:→ ctrlbreak: 符不符合需求XD07/12 19:27
34F:推 lc85301: 看 asm 没必要吧,debug build 就可以了07/12 22:38
※ 编辑: handofn0xus (42.72.7.15 台湾), 07/26/2024 14:16:57
35F:推 OnlyRD: 怀疑是是你的程式有溢位或是memory leak,所以才会 03/18 02:40
36F:→ OnlyRD: debug没事release有事。用工具去扫一下程式码看有 03/18 02:40
37F:→ OnlyRD: 没有风险。 03/18 02:40