【问题标题】:Difference between Visual Studio launching an executable and launching it yourself?Visual Studio 启动可执行文件和自己启动它的区别?
【发布时间】:2012-03-25 08:35:29
【问题描述】:

我在 C# 4.0 (VS2010) 中开发一个应用程序,我遇到了一个非常奇怪的情况。所有团队都向我报告了一个错误,但我总是无法重现它,直到其他开发人员告诉我双击可执行文件并按照错误的场景而不是从 VS2010 启动它。

经过一番研究,我发现大多数关于这个问题的 cmets 都是关于未初始化的堆内存之类的,但是在 C++ 上下文中。我知道如果变量未初始化,C# 会产生 error 而不是警告,所以这很可能不是问题。

两个版本在我的机器和用户的机器上都是一样的,我现在知道按 F5(从调试开始)不会产生问题,而 Ctrl+F5 确实如此。所以问题不是两者之间的区别(其他问题已经解决了),而是:将调试器附加到 C# 进程如何影响其行为?!

代码通过网络创建连接。

【问题讨论】:

    标签: c# visual-studio-2010 visual-studio-debugging


    【解决方案1】:

    所以问题是:将调试器附加到 C# 进程如何影响其行为?!

    以各种方式。它会影响 JIT 优化、垃圾回收、计时(想想竞争条件)、任何显式尝试检测它是否在调试器中运行的内容,以及可能影响类型初始化的顺序和时间。

    如果您现在可以重现它,我将开始添加日志记录并查看它会将您引向何方 - 一旦您找出问题的真正原因,您可能会发现调试器更改内容的原因很明显。

    【讨论】:

    • 请注意,在调试器中运行的上述问题中,我认为最可能的错误原因是假设代码未明确检测到正在运行的竞争条件调试器。 JIT 优化和垃圾收集问题更有可能表现为调试版本中的错误,而不是发布版本中的错误。
    • [@JonSkeet, @dotancohen] 我试图通过按照有问题的方法生成消息框来解决这个问题。在我的第一次试验中,我从第一行代码生成了一个消息框。问题再也没有出现过!!这可能是什么原因?消息框怎么能有这么大的不同?!
    • @OmarOthman:非常轻松 - 消息框非常具有侵入性,从根本上影响时间等方面。我建议使用侵入性较小的日志记录...理想情况下,甚至只定期接触文件系统,以减少对时间等的影响。
    • [@JonSkeet] 我已经采用了你的“计时”,只是在方法的开头做了一个Thread.Sleep(20);,一切正常。这是我第一次看到“确定性竞争条件”!我对实际问题一无所知……这很糟糕。感谢您的帮助和快速回复。
    • @OmarOthman:所以这可能不仅仅是时间问题,但与侵入性较小的日志记录相比,MessageBox.Show 仍在进行很多。所以回到能够重现它,并巧妙地添加日志记录,在问题消失时回溯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2019-12-04
    • 2013-04-10
    • 1970-01-01
    • 2022-10-07
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多