2008-09-23 56 views
2

有一个用C#编写的桌面应用程序,它尝试管理套接字连接并失败,但在将相同的应用程序连接到Visual Studio后成功。为什么在连接VS调试器后,应用程序的行为会有所不同?

它怎么被调试?

+0

这是一个Heisenbug的例子吗? http://en.wikipedia.org/wiki/Heisenbug#Heisenbugs – 2008-09-23 12:11:26

+0

没有它只是我今天遇到的一个应用程序。 – 2008-09-23 12:12:59

回答

0

这是一个时机的经典例子。

如果它在调试器中工作,那么这意味着你必须重新分解你的代码来处理这个问题。

现在如果你是一个服务器套接字,它接收来自客户端的连接并尝试为每个连接产生一个线程,你可能不得不考虑使用select()来管理一个线程中的连接。

1

通常情况下,计时问题。是否有涉及的线程?如果是C/C++,那么可能会有很多原因,因为内存管理错误可能会如何表现。

0

在编译器下运行时,与独立运行相比,您可能有变量的默认值不同。如果涉及到线程,竞争条件可能是另一个想法。

如果您通过malloc或new分配RAM,那么在使用之前请确保内存已正确初始化。

5

我会说计时问题也附加调试器会稍微放慢代码,这可能意味着竞争条件不会发生。

调试它,试图将一些日志代码添加到您的应用程序,我个人使用log4net

你不应该有和使用malloc的问题,因为你是在C#编码等。

如果您正在运行Web应用程序,那么VS中的cassini webserver和您正在部署的cassini webserver可能也有所不同。

0

我们实际上遇到过类似的问题。时机是其中的关键部分。以及向代码中抛出禁止代码(主要区别在于调试代码)。

使用套接字编程,看起来像使用VisualStudio.Net进行调试就像进行额外的Application.DoEvents()调用一样。除非我们通过调用Application.DoEvents()来允许组件呼吸(例如处理它自己的事件),否则我们发现我们有东西会失败(非调试)。

0

这可能是因为你看的副作用在调试器的性能。虽然这里的其他答案更可能...

相关问题