如此星辰非昨夜,为谁风露立中宵~
posted on 2008-05-15 22:31 bartholomew 阅读(2540) 评论(46) 编辑 收藏 网摘 所属分类: Dotnet
我在VS2008中可以下断点啊…… 回复 引用 查看
你确定可以跟到_oneField = GetMyString();这一行?!当然,在这一行打断点肯定是可以的,只是调试时到不了这样一行而已…… 回复 引用 查看
证明.NET在创建类的时候把所有属性值缓存起来把Get过程都调用了一遍。 回复 引用 查看
俺在VS2008中也可以调试。 跟踪到楼主所指的那行没有问题。 回复 引用 查看
Gray Zhang和Angel Lucifer 两位兄弟确定是用我文中的代码进行调试的吗?我也是在vs2008中试的啊,但怎么也调不到_oneField = GetMyString();这一行! 回复 引用 查看
俺是直接Copy的。代码一字不差。 回复 引用 查看
to zeus2:好像是这样,不然无法解释啊~ 回复 引用 查看
@Angel Lucifer。。。你运行到_oneField = GetMyString();这一行的上一行时,_oneField中还是没值?_oneField.Length == 0?? 回复 引用 查看
进一步发现问题了:如果只在_oneField = GetMyString();这一行直接加断点,可以调试到这一行;但如果在SimpleClass simpleClass = new SimpleClass();这一行加断点,然后逐行调试,那么,不管在_oneField = GetMyString();这一行是否加了断点,都无法调试到这一行 回复 引用 查看
我在VS2005中调试也没有你说的问题啊 回复 引用 查看
@bartholomew 我也发现这个问题了。 回复 引用 查看
我靠,又重新Debug了一遍。 怎么走都会走到楼主说的那一行。 晕了。 回复 引用 查看
会不会跟CPU指令乱序执行有关系? 回复 引用 查看
@Angel Lucifer我也有点晕了,我试的结果:在SimpleClass simpleClass = new SimpleClass();和_oneField = GetMyString();都加上断点的话,如果一路F10下去,到不了第二个断点,但如果一路F5下去,就可以到第二个断点。。。 回复 引用 查看
恭喜你,遇到个调试器的BUG~ 回复 引用 查看
俺自从按了F11逐语句调试后,怎么样都会Debug到第二个断点了,呵呵。 这个才算正常吧。 回复 引用 查看
@Angel Lucifer不会吧,我一路按F11也到不了第二个断点啊~ 回复 引用 查看
@bartholomew 晕。 看来只能寄希望于精通Debug的牛人来解答了。 回复 引用 查看
@Angel Lucifer我把文章改了下,希望迎来大牛的权威解释~ 回复 引用 查看
调试器有超前意识 知道OneField不能为空就提前给值了 呵呵 回复 引用
可能是 IDE 捣的鬼,当 string myString = simpleClass.OneField; 被中断时,IDE 需要显示环境变量(locals,左下角),这其中就包括了 OneField 的值,因此 get_OneField 已经会被隐式执行。当你继续时,自然不会再次执行 _oneField = GetMyString(); 这行,也就不会触发断点了。 我以前碰到过类似情况。 http://www.rainsts.net/article.asp?id=45 回复 引用
你用windbg试试就知道了,不可能到不了。 回复 引用
醒目:牛人已在21楼出现 回复 引用 查看
学习了~真是不看不知道啊 21楼的解释很详细了! 回复 引用
我复制了你的第一份代码,把断点设在你所说的那一行,结果Visual Studio能正常在这里中断,并且可以继续单步进入GetMyString()方法,_oneField字段的值也正常。(我用的是Visual Studio 2008) 回复 引用 查看
至于第二个代码,我的输出结果是: SecondField:me 回复 引用 查看
我的也正常着 回复 引用
正常的,因为_oneField在你看属性值的时候已经被执行过了 回复 引用 查看
博主用的是vs2008吗? 回复 引用
同意雨痕的,我也碰到过,是由于监视窗口可能赋值了该变量,导致代码不再执行,可以把监视窗口晴空。 回复 引用 查看
21果然大牛,发现debug可以去掉属性求值和隐式函数调用的,去掉后一切正常. 回复 引用
@Allen Lee我把文章修改了一下,你可以再看一下我更新的部分~第一份代码,你能够正常调试到那一行的原因,我猜是因为你在调试过程中,Autos窗口没有开启。。。至于第二份代码,你的输出结果正常的原因,我猜测是因为你不是在运行“simpleClass.SecondField = "me";”这一语句之前进行以下操作(即鼠标移上去查看属性值)的。。。你可以验证一下,不知道我的猜测对不对~ 回复 引用 查看
@球球对VS来说是正常操作,但是我在调试的时候,不想让它被自动赋值啊啊啊…… 回复 引用 查看
@bangbang用的是VS2008你说的“debug可以去掉属性求值和隐式函数调用”,这个是在哪儿可以自行设置吗? 回复 引用 查看
@BAsil对,不要监视那个属性,而且,不能开启Autos窗口PS:雨痕是谁?我怎么没看见他的留言呢~:) 回复 引用 查看
@Q.yuhen谢谢你的回复,很详细!唉,这种错误会在不经意间碰到,有时会让人很郁闷…… 回复 引用 查看
Options -> Debugging -> General -> Enabled property evaluation and other implicit function calls 回复 引用
@Q.yuhenOK!这个方法很管用,设置后,似乎我提到的问题都解决了!非常感谢!不过,更改这个设置后,会不会造成一些不便呢~? 回复 引用 查看
楼主你好, 我是CTI VS IDE 组的TESTER, 根据你描述的情况, 我进行了试验.最终确定你忽略了一个VS2008的设置, 请依次点击: Tools->Options->Debugging->General找到一个叫Step Over Properties and Operators(Managed Only)选项, 并取消选中这个选项.然后进行调试时就可以调试到Property的内部去了.如果还有疑问, 你发邮件到PeterLeePersonal@gmail.com 回复 引用
这个问题不能怪VS,更不是什么VS的调试禁区,还是楼主自己搞晕了。1、这段代码在逻辑上有问题,是导致这次灵异事件的一个主要原因; public string OneField { get { if (_oneField.Length == 0) { _oneField = GetMyString(); } return _oneField; } }这段代码决定了OneField只能被执行一次,这么写到是没有问题,但是: public string SecondField { get { return _secondField; } set { _secondField = value; } }这个写法有问题,应该写成: public string SecondField { get { return _secondField; } set { _secondField = value; _oneField = string.Empty; } }也就是说,每次改变SecondField的时候,要清空OneField,如果这么做,就不会有问题了。2、VS调试器实际上使用CLR调试API中的Eval方法执行对象中的属性和方法,这是VS调试器为方便开发调试而提供的一个非常实用的功能。也就是说,在你对OneField进行添加到监制、快速监视的时候,其实就已经执行过一遍Get方法了,OneField的长度已经大于0了,此后在任何时候也没有清空OneField,所以就不会再执行_oneField = GetMyString();了,这是楼主自己给自己下的套哦!综上所述:可以解释所有灵异现象了吧,如果在 simpleClass.SecondField = "me";执行前查看了OneField的值(触发一次Eval方法执行OneField的Get),那么最后结果肯定就是“SecondField:”,此外结果都是“SecondField:me”。 回复 引用 查看
@Justin谢谢你这么详细的回复~你说的两个问题:第一,“这段代码在逻辑上有问题”,因为这段代码是别的同事写的,我在调试的时候也发现有些逻辑考虑得不是很严密,给我造成了很大的困扰~不过,我觉得造成我提出的问题的原因,在此处倒不是因为不严密的逻辑,还是VS太智能了,帮我们做了一些操作,而这些操作,却根本调试不进去,呵呵~第二,我也不想给自己下套啊,这是VS的默认设置给我下的套啊,呵呵 回复 引用 查看
@PeterLeePersonal找不到你说的Step Over Properties and Operators(Managed Only)这个选项。。。 回复 引用 查看
楼主 21楼就是雨痕阿,呵呵 回复 引用 查看
学习了,雨痕在06年8月就发过类似问题的文章了。 回复 引用
我很早就遇到过这样的问题 - 大凡能在 IDE 中自动取值的玩意儿都可能有同样的问题. 回复 引用 查看
楼主在Auto窗添加了对simpleClass.OneField的监控那执行到断点时其实simpleClass.OneField已经是相当于被AUTO窗口调用一次了。等到你一步一步跟踪下去时由于_oneField的长度不再是0,自然不会再执行if里面的赋值动作。 回复 引用 查看
昵称: [登录] [注册]
主页:
邮箱:(仅博主可见)
验证码: 看不清,换一个
评论内容:
登录 注册
[使用Ctrl+Enter键快速提交评论]
Powered by: 博客园 Copyright © bartholomew