Windbg 搜索大小大于阈值的对象

Windbg 搜索大小大于阈值的对象,windbg,sos,sosex,Windbg,Sos,Sosex,其中一个类在.NET堆中有许多对象,这是通过下面的sos命令发现的 !dumpheap -stat -type MyClass Statistics: MT Count TotalSize Class Name 00007ff8e6253494 1700 164123 MyNameSpace.MyClass 我需要找到对象大小大于5MB的对象的实例。我知道我可以使用以下命令列出所有1700个MyClass实例的objsize .

其中一个类在.NET堆中有许多对象,这是通过下面的sos命令发现的

!dumpheap -stat  -type MyClass
Statistics:
              MT    Count    TotalSize    Class Name
00007ff8e6253494     1700     164123  MyNameSpace.MyClass
我需要找到对象大小大于5MB的对象的实例。我知道我可以使用以下命令列出所有1700个MyClass实例的objsize

.foreach (res {!DumpHeap -short -MT 00007ff8e6253494 }) {.if ( (!objsize res) > 41943040) {.echo res; !objsize res}}
使用上面的脚本,尽管存在大于5MB的对象实例,但我没有得到任何结果。我认为问题可能在于objsize的输出如下

20288 (0x4f40) bytes

这是一个字符串,使得它更难与任何阈值进行比较。如何让这个脚本只列出对象大小大于5MB的对象

在WinDbg中创建复杂脚本非常容易出错。在这种情况下,我切换到,这是一个使用Python的WinDbg扩展

在下文中,我将仅介绍您的拼图中缺失的部分,即不起作用的部分:

.if ( (!objsize res) > 41943040) {.echo res; !objsize res}
以下是我的出发点:

0:009> !dumpheap -min 2000
         Address               MT     Size
00000087c6041fe8 000007f81ea5f058    10158     
00000087d6021018 000007f81ea3f1b8     8736     
00000087d6023658 000007f81ea3f1b8     8192     
00000087d6025658 000007f81ea3f1b8    16352     
00000087d6029638 000007f81ea3f1b8    32672  
您可以编写这样的脚本(无错误处理!)

并在循环中使用它:

0:009> .foreach (res {!dumpheap -short -min 2000}) { !py c:\tmp\size.py ${res}}
00000087c6041fe8 10160
00000087d6021018 37248
00000087d6023658 27360
00000087d6025658 54488
00000087d6029638 53680
请注意
的大小!objsize
的不同!转储堆
。仅用于交叉检查:

0:009> !objsize 00000087d6023658
sizeof(00000087d6023658) = 27360 (0x6ae0) bytes (System.Object[])

另请参阅如何使用
expr()
改进脚本,以便可以传递表达式等。我现在的做法是以十进制输出大小,但这并不明确。也许你想输出一个
0n
前缀来说明问题。

就像Steve评论的那样!dumpeap接受一个min和max参数,通过这些参数,应该可以以本机方式执行此操作

0:004>!DumpHeap-类型System.String-stat

Statistics:
      MT    Count    TotalSize Class Name
6588199c        1           12 System.Collectionsxxxxx
65454aec        1           48 System.Collectionsxxxxx
65881aa8        1           60 System.Collectionsxxxxx
6587e388       17          596 System.String[]
6587d834      168         5300 System.String
Total 188 objects
Statistics:
      MT    Count    TotalSize Class Name
6587e388        3          212 System.String[]
6587d834        9          684 System.String
Total 12 objects
 Address       MT     Size
01781280 6587d834       76     
01781354 6587d834       78     
017813e8 6587d834       62     
01781478 6587e388       84     
017816d8 6587d834       64     
01781898 6587d834      106     
01781998 6587d834       78     
017819e8 6587d834       70     
01781a30 6587d834       82     
01782974 6587d834       78     
01782a6c 6587d834       90     
01782c7c 6587d834       68     
01783720 6587e388       64     
01783760 6587e388       64     
01783e4c 6587d834       62     

Statistics:
      MT    Count    TotalSize Class Name
6587e388        3          212 System.String[]
6587d834       12          914 System.String
Total 15 objects
0:004>!转储堆-类型System.String-stat-最小0n64-最大0n100

Statistics:
      MT    Count    TotalSize Class Name
6588199c        1           12 System.Collectionsxxxxx
65454aec        1           48 System.Collectionsxxxxx
65881aa8        1           60 System.Collectionsxxxxx
6587e388       17          596 System.String[]
6587d834      168         5300 System.String
Total 188 objects
Statistics:
      MT    Count    TotalSize Class Name
6587e388        3          212 System.String[]
6587d834        9          684 System.String
Total 12 objects
 Address       MT     Size
01781280 6587d834       76     
01781354 6587d834       78     
017813e8 6587d834       62     
01781478 6587e388       84     
017816d8 6587d834       64     
01781898 6587d834      106     
01781998 6587d834       78     
017819e8 6587d834       70     
01781a30 6587d834       82     
01782974 6587d834       78     
01782a6c 6587d834       90     
01782c7c 6587d834       68     
01783720 6587e388       64     
01783760 6587e388       64     
01783e4c 6587d834       62     

Statistics:
      MT    Count    TotalSize Class Name
6587e388        3          212 System.String[]
6587d834       12          914 System.String
Total 15 objects
0:004>!转储堆-类型System.String-最小值0n64-最大值0n100

 Address       MT     Size
01781280 6587d834       76     
01781354 6587d834       78     
01781478 6587e388       84     
017816d8 6587d834       64     
01781998 6587d834       78     
017819e8 6587d834       70     
01781a30 6587d834       82     
01782974 6587d834       78     
01782a6c 6587d834       90     
01782c7c 6587d834       68     
01783720 6587e388       64     
01783760 6587e388       64     

Statistics:
      MT    Count    TotalSize Class Name
6587e388        3          212 System.String[]
6587d834        9          684 System.String
Total 12 objects
操纵最大值和最小值,我们可以微调到一个或两个对象
例如,我们在上侧有一个额外对象,在下侧有两个额外对象
从前面的输出(15个对象与12个对象)

0:004>!转储堆-类型System.String-最小0n62-最大0n106

Statistics:
      MT    Count    TotalSize Class Name
6588199c        1           12 System.Collectionsxxxxx
65454aec        1           48 System.Collectionsxxxxx
65881aa8        1           60 System.Collectionsxxxxx
6587e388       17          596 System.String[]
6587d834      168         5300 System.String
Total 188 objects
Statistics:
      MT    Count    TotalSize Class Name
6587e388        3          212 System.String[]
6587d834        9          684 System.String
Total 12 objects
 Address       MT     Size
01781280 6587d834       76     
01781354 6587d834       78     
017813e8 6587d834       62     
01781478 6587e388       84     
017816d8 6587d834       64     
01781898 6587d834      106     
01781998 6587d834       78     
017819e8 6587d834       70     
01781a30 6587d834       82     
01782974 6587d834       78     
01782a6c 6587d834       90     
01782c7c 6587d834       68     
01783720 6587e388       64     
01783760 6587e388       64     
01783e4c 6587d834       62     

Statistics:
      MT    Count    TotalSize Class Name
6587e388        3          212 System.String[]
6587d834       12          914 System.String
Total 15 objects
如果一个人出于某种原因需要地址和大小,他可以随时查看

0:004>.shell-ci“!DumpHeap-type System.String-min 0n62-max 0n106”awk“{print$1,$3}”


说得好。但是,我要问的是,如何将包含十进制、十六进制和单位(字节)大小的objsize的返回值与阈值进行比较。我已经删除了我的答案,因为我不小心发布了一个相当于的解决方案!objsize.Steve后来删除了他的回答,因为dumpheap不提供包含大小,然而,基于需要对象包含大小的问题,我不确定是否调用
awk
nativelySure是否有一个awk克隆扩展iirc mex