首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SOS (或SOSEX)在WinDbg中的某个字段中显示具有特定值的托管对象?

如何使用SOS (或SOSEX)在WinDbg中的某个字段中显示具有特定值的托管对象?
EN

Stack Overflow用户
提问于 2013-12-24 19:08:58
回答 1查看 2.5K关注 0票数 6

我的问题是:

代码语言:javascript
复制
0:000> !DumpHeap -type Microsoft.Internal.ReadLock -stat
------------------------------
Heap 0
total 0 objects
------------------------------
Heap 1
total 0 objects
------------------------------
Heap 2
total 0 objects
------------------------------
Heap 3
total 0 objects
------------------------------
total 0 objects
Statistics:
              MT    Count    TotalSize Class Name
000007fef3d14088    74247      2375904 Microsoft.Internal.ReadLock
Total 74247 objects

读取此输出的方式是,堆中有74,247个Microsoft.Internal.ReadLock实例。然而,其中一些可能正在等待收集。

我只想显示那些没有挂起的收集。

例如,0000000080f88e90是其中一个对象的地址,它是垃圾。我知道,因为:

代码语言:javascript
复制
0:000> !mroot 0000000080f88e90
No root paths were found.
0:000> !refs 0000000080f88e90 -target
Objects referencing 0000000080f88e90 (Microsoft.Internal.ReadLock):
NONE
0:000> !do 0000000080f88e90
Name:        Microsoft.Internal.ReadLock
MethodTable: 000007fef3d14088
EEClass:     000007fef3c63410
Size:        32(0x20) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.ComponentModel.Composition\v4.0_4.0.0.0__b77a5c561934e089\System.ComponentModel.Composition.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fef3d13fb0  400001e        8 ...oft.Internal.Lock  0 instance 0000000080001010 _lock
000007fef0a8c7d8  400001f       10         System.Int32  1 instance                1 _isDisposed

可以看到,sosex.mrootsosex.refs都表明没有人引用它,再加上转储它的字段会显示它是通过IDisposable处理的,因此有理由认为该对象是垃圾(我知道被释放并不意味着该对象是垃圾,但在本例中是垃圾)。

现在,我想显示所有那些不是垃圾的实例。我想我将使用.foreach命令。就像这样:

代码语言:javascript
复制
.foreach(entry {!dumpheap -type Microsoft.Internal.ReadLock -short}){.if (???) {.printf "%p\n", entry} }

我的问题是,我不知道进入.if条件的是什么。

我能够像这样检查_isDisposed字段:

代码语言:javascript
复制
0:000> dd 0000000080f88e90+10 L1
00000000`80f88ea0  00000001

但是.if需要一个表达式,而我所拥有的只是一个命令输出。如果我知道如何从命令输出中提取信息并将其作为表达式排列,那么我就可以使用它作为.if条件,并且做得很好。

所以,我的问题是-是否有一种方法可以将字段值作为一个适合于.if的表达式?或者,是否可以以一种适合将结果用作.if条件的方式解析命令输出?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-25 19:05:39

我没有使用ReadLock对象的示例,但是我尝试使用String,这是我的结果:

代码语言:javascript
复制
.foreach (entry {!dumpheap -short -type Microsoft.Internal.ReadLock}) 
{ 
    .if (poi(${entry}+10) == 1)  
    {
         .printf "%p\n", ${entry}
    }
}

我使用poi()从地址获取指针大小数据。还请注意,我在poi()和.printf中都使用了${ entry }而不是entry。您也可能喜欢在.if中执行${entry}。

在一行中复制/粘贴:

代码语言:javascript
复制
.foreach (entry {!dumpheap -short -type Microsoft.Internal.ReadLock}) {.if (poi(${entry}+10) == 1) {.printf "%p\n", ${entry}}}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20765713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档