添加VS调试器后,为什么应用程序的行为会有所不同?

时间:2020-03-06 14:35:38  来源:igfitidea点击:

有一个试图管理套接字连接而编写的桌面应用程序,但是在将同一应用程序连接到Visual Studio之后却失败了,但是成功了。

如何调试?

解决方案

通常,时间问题。是否涉及线程?如果是C / C ++,则可能有很多原因,原因是内存管理错误的行为方式。

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

如果要通过malloc或者new分配RAM,则在使用内存之前,请确保已正确初始化了内存。

我想说,添加调试器的时序问题也会使代码稍微变慢,这可能意味着没有发生竞争状况。

要对其进行调试,请尝试向应用程序添加一些日志记录代码,我个人使用log4net

我们不应该在使用c#进行编码时遇到malloc之类的问题。

如果我们正在运行Web应用程序,则VS中的Cassini Web服务器和我们要部署到的Cassini Web服务器也可能有所不同。

这是计时的经典示例。

如果它在调试器中有效,则意味着我们必须对代码进行一些重构以处理此问题。

现在,如果我们是app,则是一个服务器套接字,它从客户端接收连接并尝试为每个连接生成一个线程,则可能必须考虑使用select()在一个线程中管理连接。

实际上,我们遇到了类似的问题。定时是其中的关键部分。以及在代码中添加无操作内容(带有调试代码的主要区别)。

通过套接字编程,似乎使用VisualStudio.Net进行调试就像进行了添加的Application.DoEvents()调用一样。我们发现,除非通过调用Application.DoEvents()允许组件呼吸(例如处理其自身的事件),否则我们的东西将会失败(非调试)。

当Visual Studio添加到应用程序时,CLR和JIT具有细微的运行时差异以启用调试。例如,垃圾收集是不同的。

http://stupiddumbguy.blogspot.com/2008/05/net-garbage-collection-behavior-for.html

这可能是因为我们正在调试器中观察带有副作用的属性。虽然这里的其他答案更有可能...