最近出现一怪事:调试时断点不匹配,而且找不到标识符
例如:
void Foo()
{
int a=SomeMethod();//断点在这一行
Console.WriteLine("OK");
}
我把断点设在第一行,调试时居然自动跑到第二行去了;而且我想在监视窗口中看一下a的值,结果提示我当前上下文不存在名称a
类似的问题出现好几次了,我的感觉就是符号文件出问题了,Clean之后问题依旧
今天又遇到这个问题了,突然一想,会不会是因为编译成Release的原因呢?(手头这个项目之前已经完成了,最近有点改动,所以没有改成Debug版本)
试了一下,果然如此。
其实早就知道Release会进行代码优化,不过以前一直没注意到。
在这里,编译器认为变量a未被使用,所以将其优化掉了(但实际上这条语句是有用的,因为函数调用可能有副作用,比如DateTime.Now每次的调用结果就不同,所以如果直接在监视窗口里多次看函数的返回值的话,就可能产生问题),于是就找不到名称了,并且断点也自动下移了

本文探讨了在调试过程中,断点不匹配及符号文件问题如何导致名称找不到的现象,特别关注了Debug和Release模式的区别。通过实例分析,解释了编译器在Release模式下进行代码优化时,可能会导致变量被优化掉,进而影响调试体验。建议开发者在遇到此类问题时,考虑切换到Debug模式,以避免不必要的困扰。

被折叠的 条评论
为什么被折叠?



