添加VS调试器后,为什么应用程序的行为会有所不同?
有一个试图管理套接字连接而编写的桌面应用程序,但是在将同一应用程序连接到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
这可能是因为我们正在调试器中观察带有副作用的属性。虽然这里的其他答案更有可能...