标题: Visual Studio也有调试禁区?!
最新评论:[添加评论]
1. bartholomew 2008-05-16 00:09
@Angel Lucifer
不会吧,我一路按F11也到不了第二个断点啊~
2. Angel Lucifer 2008-05-16 00:14
@bartholomew
晕。
看来只能寄希望于精通Debug的牛人来解答了。

3. bartholomew 2008-05-16 00:35
@Angel Lucifer
我把文章改了下,希望迎来大牛的权威解释~
4. yuchen [未注册用户] 2008-05-16 03:27
调试器有超前意识 知道OneField不能为空就提前给值了 呵呵
5. Q.yuhen [未注册用户] 2008-05-16 04:31
可能是 IDE 捣的鬼,当 string myString = simpleClass.OneField; 被中断时,IDE 需要显示环境变量(locals,左下角),这其中就包括了 OneField 的值,因此 get_OneField 已经会被隐式执行。当你继续时,自然不会再次执行 _oneField = GetMyString(); 这行,也就不会触发断点了。

我以前碰到过类似情况。 http://www.rainsts.net/article.asp?id=45
6. wjx [未注册用户] 2008-05-16 07:31
你用windbg试试就知道了,不可能到不了。
7. Anders Liu 2008-05-16 08:31
醒目:牛人已在21楼出现
8. allies [未注册用户] 2008-05-16 08:59
学习了~真是不看不知道啊 21楼的解释很详细了!
9. Allen Lee 2008-05-16 09:03
我复制了你的第一份代码,把断点设在你所说的那一行,结果Visual Studio能正常在这里中断,并且可以继续单步进入GetMyString()方法,_oneField字段的值也正常。(我用的是Visual Studio 2008)
10. Allen Lee 2008-05-16 09:06
至于第二个代码,我的输出结果是:

SecondField:me
11. hbb0b0 [未注册用户] 2008-05-16 09:15
我的也正常着
12. 球球 2008-05-16 09:16
正常的,因为_oneField在你看属性值的时候已经被执行过了
13. bangbang [未注册用户] 2008-05-16 09:18
博主用的是vs2008吗?
14. BAsil 2008-05-16 09:23
同意雨痕的,我也碰到过,是由于监视窗口可能赋值了该变量,导致代码不再执行,可以把监视窗口晴空。
15. bangbang [未注册用户] 2008-05-16 09:28
21果然大牛,发现debug可以去掉属性求值和隐式函数调用的,去掉后一切正常.
16. bartholomew 2008-05-16 09:51
@Allen Lee
我把文章修改了一下,你可以再看一下我更新的部分~

第一份代码,你能够正常调试到那一行的原因,我猜是因为你在调试过程中,Autos窗口没有开启。。。

至于第二份代码,你的输出结果正常的原因,我猜测是因为你不是在运行“simpleClass.SecondField = "me";”这一语句之前进行以下操作(即鼠标移上去查看属性值)的。。。

你可以验证一下,不知道我的猜测对不对~
17. bartholomew 2008-05-16 09:52
@球球
对VS来说是正常操作,但是我在调试的时候,不想让它被自动赋值啊啊啊……
18. bartholomew 2008-05-16 09:54
@bangbang
用的是VS2008

你说的“debug可以去掉属性求值和隐式函数调用”,这个是在哪儿可以自行设置吗?


19. bartholomew 2008-05-16 09:56
@BAsil
对,不要监视那个属性,而且,不能开启Autos窗口

PS:雨痕是谁?我怎么没看见他的留言呢~:)
20. bartholomew 2008-05-16 09:58
@Q.yuhen
谢谢你的回复,很详细!
唉,这种错误会在不经意间碰到,有时会让人很郁闷……
21. Q.yuhen [未注册用户] 2008-05-16 09:58
Options -> Debugging -> General -> Enabled property evaluation and other implicit function calls
22. bartholomew 2008-05-16 10:05
@Q.yuhen
OK!
这个方法很管用,设置后,似乎我提到的问题都解决了!非常感谢!

不过,更改这个设置后,会不会造成一些不便呢~?
23. PeterLeePersonal [未注册用户] 2008-05-16 10:06
楼主你好, 我是CTI VS IDE 组的TESTER, 根据你描述的情况, 我进行了试验.
最终确定你忽略了一个VS2008的设置, 请依次点击: Tools->Options->Debugging->General
找到一个叫Step Over Properties and Operators(Managed Only)选项, 并取消选中这个选项.
然后进行调试时就可以调试到Property的内部去了.
如果还有疑问, 你发邮件到PeterLeePersonal@gmail.com
24. Justin 2008-05-16 10:13
这个问题不能怪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();了,这是楼主自己给自己下的套哦!
...
25. bartholomew 2008-05-16 10:28
@Justin
谢谢你这么详细的回复~

你说的两个问题:
第一,“这段代码在逻辑上有问题”,因为这段代码是别的同事写的,我在调试的时候也发现有些逻辑考虑得不是很严密,给我造成了很大的困扰~不过,我觉得造成我提出的问题的原因,在此处倒不是因为不严密的逻辑,还是VS太智能了,帮我们做了一些操作,而这些操作,却根本调试不进去,呵呵~

第二,我也不想给自己下套啊,这是VS的默认设置给我下的套啊,呵呵
26. bartholomew 2008-05-16 10:29
@PeterLeePersonal
找不到你说的Step Over Properties and Operators(Managed Only)这个选项。。。
27. BAsil 2008-05-16 10:54
楼主 21楼就是雨痕阿,呵呵
28. Duron800 [未注册用户] 2008-05-16 11:16
学习了,雨痕在06年8月就发过类似问题的文章了。
29. 随风流月 2008-05-16 11:52
我很早就遇到过这样的问题 - 大凡能在 IDE 中自动取值的玩意儿都可能有同样的问题.
30. Klesh Wong 2008-05-17 11:19
楼主在Auto窗添加了对simpleClass.OneField的监控
那执行到断点时其实simpleClass.OneField已经是相当于被AUTO窗口调用一次了。
等到你一步一步跟踪下去时由于_oneField的长度不再是0,自然不会再执行if里面的赋值动作。
下一页
添加评论 | 返回随笔
返回顶部 | 返回首页