代码之家  ›  专栏  ›  技术社区  ›  Adam Robinson

确定线程的源

  •  5
  • Adam Robinson  · 技术社区  · 15 年前

    我在一个小应用程序中经历了高度的闪烁和用户界面延迟,我开发这个小应用程序是为了测试我为我们的一个应用程序编写的组件。因为闪烁和延迟是在空闲时间发生的(当应该——认真地——什么都不发生的时候),我决定做一些调查。我注意到在“线程”窗口中有一些我不知道的线程(并非完全出乎意料),但引起我注意的是其中一个线程被设置为 Highest 优先。这个线程当时存在 Main() 甚至在我的任何代码执行之前调用。我发现这个线程似乎出现在我编写的每个.NET应用程序中,甚至控制台应用程序中。

    作为一个勇敢的灵魂,我决定冻结线程,看看发生了什么。闪烁确实停止了,但我在进行数据库交互时遇到了一些奇怪的情况(我使用的是SQL CE3.5SP1)。我的想法是,这可能是数据库实际运行的线程,但考虑到它是在应用程序加载时(在对数据库的任何引用之前)启动的,并且存在于其他非数据库应用程序中,我倾向于认为情况并非如此。

    因为这个线程(和其他一些线程一样)在location列中没有显示数据,并且如果我在暂停时在调试器中切换到它,就没有列出调用堆栈,所以我尝试通过getcurrentprocess()匹配startaddress属性。对应线程的线程,但它不在当前加载的所有模块地址范围内。

    有人知道这条线是什么吗,或者我怎么知道的?

    编辑

    在进行一些挖掘之后,看起来startaddress在kernel32.dll中(基于附近的内存内容)。这让我认为这只是用于启动线程的标准系统函数,根据 this page ,这基本上让我回到平方一,以确定这条线实际上是从哪里来的。这个列表中的所有线程的startaddress值都相同,这一事实进一步证实了这一点,这导致我问到底是什么目的……?

    编辑2

    ProcessExplorer让我找到一个真正有意义的起始地址。看起来像是 mscorwks.dll!CreateApplicationContext+0xbbef . 此dll位于%windows%\microsoft.net\framework\v2.0.50中,因此它看起来显然是运行时程序集。我还是不知道为什么

    • 这是最高优先级
    • 它似乎在我的申请中引起了打嗝。
    3 回复  |  直到 15 年前
        1
  •  6
  •   Community CDub    7 年前

    你可以尝试使用 Sysinternals . Process Explorer 让我们深入挖掘。右键单击进程以访问属性。然后是“线程”选项卡。在这里,您可以看到线程的堆栈和模块。

    编辑:

    asking 在某些情况下,您的“最高”优先级线程似乎是 Finalizer 由于垃圾收集而运行的线程。我仍然没有一个很好的理由来解释为什么它会持续运行。也许你在你的过程中有一些奇怪的对象生命周期行为?

        2
  •  2
  •   Tim Robinson    15 年前

    我不确定这是什么,但如果打开非托管调试,并使用 Windows symbol server 你可能会得到更多的线索。

        3
  •  0
  •   Vilx-    15 年前

    可能是垃圾收集器线程。当我调查一个与终结器相关的bug时,我也注意到了。可能您的系统内存不足,GC一直在尝试收集?这也是前面提到的bug中的情况。我不能在我的机器上复制它,但是我的一个同事有一台RAM更少的机器,在那里它会像钟表一样重新出现。