Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按引用类型和获取字段值的WinDbg.foreach_C#_Windbg - Fatal编程技术网

C# 按引用类型和获取字段值的WinDbg.foreach

C# 按引用类型和获取字段值的WinDbg.foreach,c#,windbg,C#,Windbg,如何迭代引用类型(例如MyClass)并获取其中一个字段的值(值类型) 我使用下一个代码 .foreach (address {!DumpHeap -type MyClass -short }) {!do ${address} (what I do next?) } 我获得对象转储,但如何获得所有对象的字段值?首先,您需要通过转储单个对象来找出各个字段的偏移量: 0:016> !do 00000000115bff60 Name: System.Action MethodTable:

如何迭代引用类型(例如MyClass)并获取其中一个字段的值(值类型)

我使用下一个代码

.foreach (address  {!DumpHeap -type MyClass -short }) {!do ${address} (what I do next?) }

我获得对象转储,但如何获得所有对象的字段值?

首先,您需要通过转储单个对象来找出各个字段的偏移量:

0:016> !do 00000000115bff60 
Name: System.Action
MethodTable: 000007fedb35ff30
EEClass: 000007fedb111f90
Size: 64(0x40) bytes
 (C:\Windows\assembly\GAC_MSIL\System.Core\3.5.0.0__b77a5c561934e089\System.Core.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fedc267680  40000ff        8        System.Object  0 instance 00000000115bff60 _target
000007fedc266138  4000100       10 ...ection.MethodBase  0 instance 0000000000000000 _methodBase
000007fedc26a798  4000101       18        System.IntPtr  1 instance      7fedf0bf238 _methodPtr
000007fedc26a798  4000102       20        System.IntPtr  1 instance      7fedf0fa850 _methodPtrAux
000007fedc267680  400010c       28        System.Object  0 instance 0000000000000000 _invocationList
000007fedc26a798  400010d       30        System.IntPtr  1 instance                0 _invocationCount
接下来,可以在循环中使用偏移量。请注意,为了避免冲突,我将
-type
更改为
-mt
<代码>!执行按子字符串搜索,其中可能包含您不期望的对象

根据字段的类型,您可以使用
d*${address}+[L]
转储值类型

0:016> .foreach (address  {!DumpHeap -mt 000007fedb35ff30 -short }) {dp ${address}+0x20 L1}
00000000`114cfc48  00000000`114ce518
...
或者
!执行poi(${address}+)
以转储.NET对象

0:016> .foreach (address  {!DumpHeap -mt 000007fedb35ff30 -short }) {!do poi(${address}+0x8)}
Name: PaintDotNet.Controls.UnitsComboBoxStrip
MethodTable: 000007fed94cd120
EEClass: 000007fed91b38f8
Size: 224(0xe0) bytes
 (C:\Program Files\Paint.NET\PaintDotNet.exe)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fedc267680  400018a        8        System.Object  0 instance 0000000000000000 __identity
000007fedb6cd320  40008e0       10 ...ponentModel.ISite  0 instance 0000000000000000 site
000007fedb6fcc18  40008e1       18 ....EventHandlerList  0 instance 00000000114d0050 events
...

你好你需要提高问题的质量,以避免被否决。请为代码块使用适当的格式化工具,并对您尝试执行的操作进行一些分析。欢迎来到SO,我不知道这里有什么太宽了。答案不多,一个好的答案不需要很长时间。唯一可能发生的事情是它是一个复制品@PhilipPittle:这与C#有关,因为它使用SOS命令来调试它。@ThomasW。这更有道理。我将删除我先前的评论。我认为OP的代码样本应该是C#优秀的。如果类型是字符串,是否可以只打印它的值?@yonisha:我很确定这是可能的。这可能与我手头没有完整的样品有关或类似。如果你能等一天,我可能会举个例子。