windbg - 如何在 64 位转储中引用 32 位整数数据

标签 windbg sos

如果我在 64 位 .Net 进程转储的已知内存地址处有一个 System.Int32,我如何在 Windbg 的条件或表达式中引用其数据?例如:

? poi(000000ba2e4de938) == 0n27 显示为 0 而不是 1,尽管我知道该地址处的值是 27(dt int 000000ba2e4de938 显示0n27)。它这样做是因为它在我尝试访问的值之后拾取了 32 个垃圾位,因为 poi 获取了指针大小的数据。

有没有办法获取一定大小的数据以在表达式中使用?到目前为止,我只找到了转储数据的方法,但没有在表达式或条件中使用它。

最佳答案

简短回答:对于 32 位使用 dwo(...),对于 64 位使用 qwo(...) 以及 poi(...) 取决于架构的大小。

长答案:

让我们先看看带有 SOS 的 Int32:

0:014> .symfix
0:014> .reload
0:014> .loadby sos clr
0:006> !name2ee *!System.Int32
Module:      000007feecab1000
Assembly:    mscorlib.dll
Token:       00000000020000f0
MethodTable: 000007feed1603d0
EEClass:     000007feecb71810
Name:        System.Int32
[...]
0:006> !dumpheap -mt 000007feed1603d0
         Address               MT     Size
00000000028376d8 000007feed1603d0       24 

0:006> !do 00000000028376d8 
Name:        System.Int32
MethodTable: 000007feed1603d0
EEClass:     000007feecb71810
Size:        24(0x18) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007feed1603d0  400055f        8         System.Int32  1 instance             8868 m_value

从该输出中,您可以看到 Int32 的值 (m_value) 位于对象的地址 + 偏移量 8 处。

Int32的长度是32位,所以我们需要dd(转储DWORD)来查看内存:

0:006> dd 00000000028376d8+8 L1
00000000`028376e0  000022a4

将其转换为十进制,这将是 SOS 之前显示的内容:

0:006> ? 22a4
Evaluate expression: 8868 = 00000000`000022a4

要在条件中使用它,请使用 dwo(DWORD 大小)而不是 poi(指针大小,在 64 位上为 qwo ):

0:006> ? dwo(00000000028376d8+8)
Evaluate expression: 8868 = 00000000`000022a4

关于windbg - 如何在 64 位转储中引用 32 位整数数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37991872/

相关文章:

debugging - 什么是 mdToken?它与 MethodTable 有何不同?

windbg - 如何分析 .NET 进程的非托管堆大小

.net - 在带有 SOS 的 WinDbg 中查找静态字段的地址

jquery - 检查表单输入提供的变量以查看它是否存在于数组中。我缺少什么?

.net-core - WinDbg+SOS : How to view the . NET 对象包装句柄?

.NET 内存泄漏 - System.WeakReference 对象累积

.net - 计算对象的大小,使其包括其所有子对象的大小和(孙子链)

windbg - 如何从 DLL 的堆标记中受益?

windows - windbg 首先连接然后在内核调试期间停留在 "Debuggee not connected."消息上

c# - 带有 SOS 的 Windbg,如何转储 c# 结构