哪个线程正在使用给定的对象?

时间:2011-11-29 18:32:13

标签: c# multithreading windbg sos

  1. 我运行dumpheap -type MyObjectType命令获取MyObjectType的方法表。它在堆上显示三个对象。
  2. 我运行dumpheap -mt <method table address>来获取地址。
  3. 我运行!gcroot <address>命令查找对这些对象的引用,找不到任何内容
  4. !do <address>,它提供了有关此对象的字段的详细信息等。
  5. 如何找到引用或使用对象的线程?任何找到它的命令?

2 个答案:

答案 0 :(得分:1)

没有简单的方法可以执行此操作,但您可以为每个线程运行!dso(即~*!dso)。这将告诉您每个线程引用哪些对象。为了帮助导航输出,我通常将其记录到文件中,并使用grep或体面的文本编辑器来搜索结果。

答案 1 :(得分:0)

您可能会尝试使用Microsoft's CLR Profiler来找出分配和访问对象的线程。我不确定!gcroot是否显示等待终结器的对象,但CLR Profiler肯定会这样做。您的对象也可能根本没有从任何GC根引用,只是等待收集发生。如果在LOB堆中分配它可能需要相当长的时间。尝试强制几个GC(并查看gen0-2集合是否真的发生)并查看你的对象是否存活。