【问题标题】:Thread.Abort() when running a debug app hosted in Visual Studio vs. running it directly运行 Visual Studio 中托管的调试应用程序与直接运行它时的 Thread.Abort()
【发布时间】:2011-07-17 16:41:29
【问题描述】:

我们有一个线程,当我们在外部调用 Thread.Abort() 时,会捕获 ThreadAbortException,因为我们需要进行一些清理工作。特别是,需要一个互斥锁。在 Visual Studio 之外以调试模式运行应用程序时会崩溃,但在 Visual Studio 中托管时,一切运行正常。我听说垃圾收集器在托管和不托管时运行不同。这可能与线程有关吗?抛出的错误是缓冲区溢出。

谢谢!

【问题讨论】:

  • 我们不知道,我们收集的调用堆栈都在 Microsoft DLL 中,我们无法确定所有线程的确切上下文。
  • 这个帖子的真正目的是收集人们的 cmets,了解在附加到调试器时运行时的区别。
  • 强制说明:您根本不应该使用Thread.Abort()。这是一个讨厌的野兽,每个人都不建议,包括 MSDN
  • @Ssebu - 如果问题的重点是询问差异,您应该问这个问题。如果您需要有关特定问题的帮助,请提供有关您的问题的更多信息。哪些 dll 中有错误,堆栈跟踪是什么,repro 是否始终稳定且一致?
  • 缓冲区溢出?这需要异常的堆栈跟踪来诊断,您必须发布它。启用非托管代码调试和 Microsoft 符号服务器。

标签: .net multithreading mutex


【解决方案1】:

正如 Henk 已经指出的,不要打电话给 Thread.Abort。永远。

我有一些信息on my blog 关于垃圾收集器在不同情况下的不同工作方式。但是,我相信 GC 对于在调试器中运行或在调试器之外运行 Debug 构建是相同的。

如果您想回答其他问题,您需要发布更多信息。 “崩溃”不是一个描述性术语;应用程序是否突然退出,或弹出您编写的对话框,或弹出 Windows 错误报告?同样,我不熟悉“缓冲区溢出”异常;对于异常,请发布异常类型、消息和完整的堆栈跟踪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2015-05-13
    • 2017-01-25
    • 2013-12-22
    • 2017-04-12
    相关资源
    最近更新 更多