有一个用c#编写的桌面应用程序试图管理套接字连接并失败,但在将相同的应用程序附加到visual studio后才能成功。
如何调试?
答案 0 :(得分:5)
我认为附加调试器的时序问题会稍微减慢代码速度,这可能意味着没有发生竞争条件。
要调试它,请尝试向您的应用程序添加一些日志记录代码,我个人使用log4net
当您使用c#编码时,您不应该遇到malloc等问题。
如果您正在运行一个Web应用程序,那么VS中的cassini Web服务器和您正在部署的那个网站服务器也可能存在差异。
答案 1 :(得分:1)
通常,时间问题。是否涉及线程?如果是C / C ++,那么由于内存管理错误可能会如何表现,可能会有很多原因。
答案 2 :(得分:0)
在编译器下运行时,您可能拥有默认值不同的变量,而不是独立的变量。如果涉及线程,竞争条件可能是另一个想法。
如果您通过malloc或new分配RAM,请确保在使用前正确初始化内存。
答案 3 :(得分:0)
这是时间的典型例子。
如果它在调试器中有效,则意味着您必须稍微重新考虑代码以处理此问题。
现在,如果你是app是一个服务器套接字,它接收来自客户端的连接并试图为每个连接产生一个线程,你可能不得不考虑使用select()来管理一个线程中的连接。
答案 4 :(得分:0)
我们实际遇到过类似的问题。时机是其中的关键部分。除了在代码中抛出无操作(主要区别与调试代码)。
使用套接字编程,似乎调试w / VisualStudio.Net就像进行了额外的Application.DoEvents()调用一样。我们发现我们有失败的东西(非调试),除非我们通过调用Application.DoEvents()允许组件呼吸(例如处理它自己的事件)。
答案 5 :(得分:0)
当Visual Studio附加到您的应用程序时,CLR和JIT具有微妙的运行时差异以启用调试。例如垃圾收集是不同的。
http://stupiddumbguy.blogspot.com/2008/05/net-garbage-collection-behavior-for.html
答案 6 :(得分:0)
可能是因为您在调试器中正在观看具有副作用的属性。虽然这里的其他答案更有可能......