gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:22:28 25 4
gpt4 key购买 nike

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

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

非常感谢任何帮助!

塞布

最佳答案

在没有调试器的情况下运行发布版本时的一个不同之处是启用了 JIT 优化器。代码运行得更快。这与您的问题有很强的相关性,线程问题对时间敏感。算你自己幸运(我相信你不会)当你的代码仍在你的开发机器上运行时这出错了,真正讨厌的线程问题是每周一次在你客户的机器上搞砸你的程序。

使这个问题可调试仍然是解决它的最重要方法。除了 Tools + Attach to Process,启动调试器的另一种方法是在代码中使用 System.Diagnostics.Debugger.Launch()。您将看到一个对话框,让您选择调试器。

另一种不需要附加调试器的方法是将 VS 切换到发布版本。使用 Tools + Options、Debugging、General 并取消勾选“Suppress JIT optimization on module load”。现在按 F5 键运行您的程序,并启用优化器并预先连接调试器。仍然不是一个 slamdunk,因为附加调试器本身会导致时序差异。

解决棘手的并发错误的另一种常用方法是在代码中添加日志记录。每当它获得锁时写一行。运气好的话,您会很快找到死锁的原因。如果您不那么幸运,日志记录会改变线程计时,足以使死锁消失。已经有很多程序启用了日志记录,因为这是保持它们运行的​​唯一方法。

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

关于c# - 运行托管在 Visual Studio 中的调试应用程序与直接运行它有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5311407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com