查找导致CannotUnloadAppDomainException的违规线程

时间:2016-09-16 16:53:14

标签: c# .net appdomain

在我的C#.Net 4.0项目中,我使用AppDomains加载插件程序集,要求它们执行工作,然后卸载AppDomain,这样我就不必将程序集保留在主程序中。

对于一个特定的插件,当我拨打CannotUnloadAppDomainException时,我会收到AppDomain.Unload()。我发现这很可能是因为插件已经启动了一个后台线程,该线程在catchfinally块中被卡住或需要很长时间(~10秒)。不幸的是,我不知道线程在哪里。

这只发生在客户的机器上,因此我无法使用调试器来提供帮助。但是,如果我能找到一些更有帮助的东西,我可以给他们一个补丁,将更多信息写入日志文件。

我有插件程序集的源代码,我一直在尝试做一些静态分析并运行一些测试,但是它非常大而且我没有找到一个被卡在{{{{ 1}}或catch

我的问题:

  1. 有没有办法获得finally,我可以获得一个在子AppDomain中使用其callstack运行的线程列表?

  2. 除了CannotUnloadAppDomainExceptioncatch块之外,还有其他代码段可以抛出此异常吗?

2 个答案:

答案 0 :(得分:1)

让客户端运行PerfView以获取程序发生时的ETW跟踪,它应该让您获得有关异常发生的确切时刻正在运行的内容的更详细信息。这是a set of video tutorials from Channel 9,向您展示如何使用它。

答案 1 :(得分:0)

使用this post中提到的Microsoft.Diagnostics.Runtime库(NuGet package),当子AppDomain的函数即将返回时,我能够列出所有仍在运行的线程及其callstack。我必须暂时将我的应用程序升级到.NET 4.5以便与库一起运行,但是库的源代码是available on GitHub,因此可以使用<来构建此库。 .Net 4.5

事实证明,当数据库在本地计算机上使用SSL时,第三方库中的一个错误处理我们的数据库连接会导致一些锁定的线程。