繁体   English   中英

运行Visual Studio中托管的调试应用程序与直接运行它之间有什么区别?

[英]What's the difference between running a debug app hosted in Visual Studio and running it directly?

我有一个在.Net framework 4上运行的应用程序,并且我的应用程序运行托管和非托管代码。 UDP套接字与自定义的通信堆栈一起使用,以与我们的自定义硬件通信。 当从Visual Studio运行该应用程序时,一切都很好,但是当单独运行该应用程序时,它通常会冻结。 我已经在Windows XP SP3和Windows 7 SP1上看到了这种行为。 冻结应用程序后,我可以看到它在大多数线程中都停留在ntdll.dll中。 另一个问题线程告诉我这是正常现象,死锁仍然是由我的代码引起的。

这很难调试,因为我只能附加到应用程序并在纯模式下暂停它,所以我所看到的只是反汇编。 我正在寻找可以帮助我的任何提示。 因此,有谁知道直接运行与使用F5从Visual Studio运行时可能导致应用程序冻结的原因? 我读到某个地方,在托管代码中,GC的行为不同,有什么区别? 另外,对于非托管代码,我收集到内存的初始化方式有所不同。 再次有什么区别?

任何帮助是极大的赞赏 !

塞布

在没有调试器的情况下运行Release内部版本的一件事是启用了JIT优化器。 代码运行速度更快。 与您的问题有很强的相关性,线程问题对时间很敏感。 算上您自己很幸运(我确定您没有),而您的代码仍在开发机器上运行时,这会出错,真正令人讨厌的线程问题是每周在您的客户机器上弄乱您的程序的那些问题。

使此问题可调试仍然是解决此问题的最重要方法。 除了“工具+附加到进程”之外,启动调试器的另一种方法是在代码中使用System.Diagnostics.Debugger.Launch()。 您将看到一个对话框,供您选择调试器。

不需要附加调试器的另一种方法是将VS切换到Release版本。 使用“工具+选项”,“调试”,“常规”,然后取消选中“在模块加载时禁止JIT优化”。 现在,按F5键将在启用优化器并预连接调试器的情况下运行程序。 由于调试器本身会引起时序差异,因此仍然不是一个明智的选择。

解决棘手的并发错误的另一种常见方法是将日志记录添加到您的代码中。 每当获得锁时就写一行。 运气好的话,您会很快找到死锁的原因。 如果您不太幸运,日志记录会更改线程计时,足以使死锁消失。 许多程序附带启用了日志记录功能,因为这是保持程序运行的唯一方法。

代码审查是另一种方法,尤其是当别人完成代码审查时。 最后但并非最不重要的一点是,考虑线程是否真的是您应用程序中的最佳解决方案。 ““我真的解决了吗?” 感觉永远不会消失,证明线程代码没有缺陷几乎是不可能的。

出现此类问题的原因可能是死锁或比赛条件。 当您调试应用程序时,它们会消失,因为断点和执行中断将更改某些代码路径的执行持续时间。
我不明白,为什么您只能以纯模式连接。 托管应用程序甚至都支持远程调试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM