【问题标题】:Tracking down slow managed DLL loading跟踪缓慢的托管 DLL 加载
【发布时间】:2009-09-22 22:32:45
【问题描述】:

我面临以下问题,此时我觉得我严重缺乏某种工具,我只是不知道那个工具是什么,或者它到底应该做什么。

设置如下: 我有一个必须在 GAC 中注册的第三方 DLL。这一切在我们之前部署软件的几乎每台机器上都运行良好。但是现在我们有 2 台机器,看起来和我们知道的可以工作的机器完全相同(它们是从同一个镜像中克隆出来的,并且填充了相同的硬件,所以几乎唯一的区别是软件设置,我一遍又一遍地检查它们,它们看起来不错)。

现在的问题是,GAC 中的 DLL 需要很长时间才能加载。至少我相信这是问题所在,我可以明确地说,从该 DLL 实例化单个类是缓慢的部分。一旦加载,事情就会像往常一样飞翔。但是,虽然在已知良好的机器上 DLL 加载速度如此之快,以至于日志中的时间戳甚至都不会改变,但在这 2 台机器上,加载需要 超过 1 分钟。

已知: 我无法访问源代码,因此无法通过 DLL 进行调试。我们的应用程序是唯一使用它的应用程序(因此不应该是同时访问问题)。此 DLL 仅存在一个版本,因此不应该是版本冲突的问题。正在使用 GAC 引用(如果我从 GAC 卸载 DLL,将引发有关缺少 GAC 引用的异常)。

在调试功能方面具有更高技能的人能否建议我可以采取哪些措施来追查此问题的根本原因?

【问题讨论】:

  • 呃,听起来是个可怕的问题。期待一个答案。您是否验证过 machine.config 文件是否相同? .DLL 是否进行任何网络调用?
  • @Alex K:这到底是怎么回事?我有一个非常相似的问题。你还记得你的解决方案吗?
  • @ralf.w。抱歉,在调查过程中没有获得深刻的见解。由于时间有限,我们只是最终更换了机器。我的 #1 嫌疑人是反病毒软件,但我无法跟进。您可以尝试禁用它(如果您的 IT 政策允许),看看是否有帮助。
  • @Alex K:谢谢你让我振作起来。我会给 AV 一个机会!

标签: .net performance dll gac dllregistration


【解决方案1】:

下载 2 个名为“filemon.exe”和“regmon.exe”的小实用程序,它们分别向您展示有关打开文件和注册表的情况。每当我无法确定程序是挂起还是正在加载时,这些工具都可以让我深入了解它们在做什么,或者它们在等待什么。

【讨论】:

    【解决方案2】:

    我认为您最好的选择是调试应用程序。调试应用程序并不严格需要源代码,它只是让它变得容易得多。这是我会使用的策略

    1. 仅禁用我的代码(工具 -> 选项 -> 调试器 -> 常规)
    2. 在调试器下启动程序
    3. 等待挂起
    4. 击破。
    5. 打开调用栈

    此时您应该能够看到程序当前中断的位置。本质上是方法的名称。这将为您提供一些指示,说明在加载期间哪些操作需要花费这么多时间(即使您没有源代码)。

    如果方法不熟悉,请在此处发回数据,希望有人能够帮助您找出问题所在。

    【讨论】:

    • 感谢您的建议,但我实际上已经这样做了,并且它在我的代码中冻结(我从该 DLL 实例化一个类)。这就是让我相信是 DLL 加载到内存中导致速度变慢的原因。我想我正在寻找的是一个工具,我可以指向 GAC 中的引用,它会告诉我正在访问它的内容(我开始怀疑病毒扫描程序可能会将其锁定以进行检查,因为我刚刚发现这两台机器没有使用相同的版本,因为它们要运送给不同的客户)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2010-12-14
    • 1970-01-01
    • 2017-10-16
    • 2014-03-08
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多