C# 为什么附加VS调试器后应用程序的行为会有所不同?
我有一个用C#编写的桌面应用程序。它正在尝试管理套接字连接,但失败。如果将同一应用程序附加到Visual Studio调试器,则该应用程序将成功C# 为什么附加VS调试器后应用程序的行为会有所不同?,c#,visual-studio,sockets,debugging,C#,Visual Studio,Sockets,Debugging,我有一个用C#编写的桌面应用程序。它正在尝试管理套接字连接,但失败。如果将同一应用程序附加到Visual Studio调试器,则该应用程序将成功 如何调试它?通常是时间问题。是否涉及到线程?如果是C/C++,那么可能有很多原因,因为内存管理错误的行为方式。在编译器下运行时,可能有一些变量的默认值与独立变量不同。如果涉及线程,竞争条件可能是另一个想法 如果您是通过malloc或new分配RAM,那么请确保在使用内存之前已正确初始化内存。我想说,连接调试器也会使代码稍微慢一点,这可能意味着没有发生争
如何调试它?通常是时间问题。是否涉及到线程?如果是C/C++,那么可能有很多原因,因为内存管理错误的行为方式。在编译器下运行时,可能有一些变量的默认值与独立变量不同。如果涉及线程,竞争条件可能是另一个想法
如果您是通过malloc或new分配RAM,那么请确保在使用内存之前已正确初始化内存。我想说,连接调试器也会使代码稍微慢一点,这可能意味着没有发生争用情况 要调试它,请尝试向应用程序添加一些日志代码,我个人使用 在使用c#编写代码时,不应该出现malloc之类的问题
如果您正在运行一个web应用程序,那么VS中的cassini web服务器可能与您正在部署的web服务器有所不同。这是一个典型的计时示例 如果它在调试器中工作,则意味着您必须对代码重新进行因子分析以处理此问题
现在,如果你的应用程序是一个服务器套接字,它从客户端接收连接并尝试为这些连接中的每一个线程生成一个线程,那么你可能不得不考虑使用Socket()来管理一个线程中的连接。时间安排是其中的一个关键部分。以及在代码中不添加操作(与调试代码的主要区别)
使用套接字编程,似乎调试w/VisualStudio.Net就像进行其他Application.DoEvents()调用一样。我们发现,除非我们通过调用Application.DoEvents()允许组件呼吸(例如,处理它自己的事件),否则我们有一些东西将失败(非调试) 当VisualStudio连接到应用程序时,CLR和JIT在运行时有细微的差异,以便能够进行调试。例如,垃圾收集是不同的
这可能是因为您正在调试器中查看带有副作用的属性。尽管这里的其他答案更有可能…这是海森堡的一个例子吗?不,这只是我今天在我们的一个应用程序中遇到的问题。他说C#——这意味着没有malloc或new,以及具有可预测默认值的变量。