代码之家  ›  专栏  ›  技术社区  ›  Alex K

跟踪慢托管dll加载

  •  4
  • Alex K  · 技术社区  · 16 年前

    我面临着以下问题,在这一点上,我觉得我严重缺乏某种工具,我只是不知道该工具是什么,或者它应该做什么。

    设置如下: 我有一个必须在GAC中注册的第三方DLL。这在我们以前部署软件的几乎每台机器上都能很好地工作。但是现在我们有了两台机器,看起来和我们所知道的机器一样(它们是从同一个图像克隆的,里面塞满了相同的硬件,所以几乎唯一的区别就是软件设置,我一遍又一遍地检查,它们看起来很好)。

    现在的问题是,GAC中的DLL需要很长的时间来加载。至少我相信这是个问题,我可以明确地说,从那个dll实例化一个类是很慢的部分。一旦装上子弹,它就会像往常一样飞起来。但是,在已知良好的计算机上,DLL加载速度非常快,日志中的时间戳甚至不会更改,在这两台计算机上,它需要 1分钟以上 加载。

    已知: 我没有访问源的权限,因此无法通过DLL进行调试。我们的应用程序是唯一使用它的应用程序(所以不应该是同时访问问题)。此dll只有一个版本,因此不应该是版本冲突问题。GAC引用正在使用中(如果我从GAC中卸载DLL,将对丢失的GAC引用引发异常)。

    在调试fu方面有更高技能的人能提出我可以做些什么来跟踪这个问题的根本原因吗?

    2 回复  |  直到 11 年前
        1
  •  2
  •   mydoghasworms    11 年前

    下载两个名为“filemon.exe”和“regmon.exe”的小实用程序,它们分别向您显示有关打开文件和注册表的情况。每当我不能决定一个程序是挂起还是只是加载时,这些工具都能让我洞察他们在做什么,或者他们在等待什么。

        2
  •  1
  •   JaredPar    16 年前

    我认为您在这里的最佳选择是调试到应用程序中。调试一个应用程序并不需要严格的源代码,它只是让它变得简单得多。下面是我将使用的策略

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

    此时,您应该能够看到程序当前中断的位置。基本上是方法的名称。这将给您一些指示,说明在加载过程中什么操作花费了如此多的时间(即使您没有源)。

    如果不熟悉该方法,请将数据发回此处,希望有人能够帮助您跟踪问题。

    推荐文章