gpt4 book ai didi

debugging - 如何使用 SOS(或 SOSEX)在 WinDbg 的字段之一中显示具有特定值的托管对象?

转载 作者:行者123 更新时间:2023-12-04 18:08:26 25 4
gpt4 key购买 nike

我的问题是这样的:

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是这些对象之一的地址,它是垃圾。我知道,因为:
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命令。像这样的东西:
.foreach(entry {!dumpheap -type Microsoft.Internal.ReadLock -short}){.if (???) {.printf "%p\n", entry} }

我的问题是我不知道 .if 中的内容健康)状况。

我可以像这样检查 _isDisposed 字段:
0:000> dd 0000000080f88e90+10 L1
00000000`80f88ea0 00000001

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

所以,我的问题是 - 有没有办法将字段值作为适用于 .if 的表达式获取?或者,是否可以以适合将结果用作 .if 的方式解析命令输出?健康)状况?

最佳答案

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

.foreach (entry {!dumpheap -short -type Microsoft.Internal.ReadLock}) 
{
.if (poi(${entry}+10) == 1)
{
.printf "%p\n", ${entry}
}
}

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

在一行中复制/粘贴:
.foreach (entry {!dumpheap -short -type Microsoft.Internal.ReadLock}) {.if (poi(${entry}+10) == 1) {.printf "%p\n", ${entry}}}

关于debugging - 如何使用 SOS(或 SOSEX)在 WinDbg 的字段之一中显示具有特定值的托管对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20765713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com