- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个小型转储,我已将 Windbg 附加到其中。小型转储来自在 IIS 上运行的 .NET 4.6.1 ASP.NET 站点。我想获取枚举的定义,但每当我获取类的 MethodTable 时,我只会得到以下内容。
0:000> !DumpMT /d 256db60c
EEClass: 256c773c
Module: 201fcfb0
Name: MyDll.eDefaultRelatedObjects
mdToken: 02000029
File: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\303e164d\216bec4f\assembly\dl3\bdb2a421\004bd941_fee1d501\MyDll.dll
BaseSize: 0xc
ComponentSize: 0x0
Slots in VTable: 23
Number of IFaces in IFaceMap: 3
0:000> !DumpClass /d 256c773c
Class Name: MyDll.eDefaultRelatedObjects
mdToken: 02000029
File: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\303e164d\216bec4f\assembly\dl3\bdb2a421\004bd941_fee1d501\MyDll.dll
Parent Class: 717f17cc
Module: 201fcfb0
Method Table: 256db60c
Vtable Slots: 17
Total Method Slots: 17
Class Attributes: 101
Transparency: Critical
NumInstanceFields: 1
NumStaticFields: 0
MT Field Offset Type VT Attr Value Name
71c9f54c 400055f 124 System.Char[] 0 shared static enumSeperatorCharArray
>> Domain:Value 09671520:NotInit 306d85b0:0d8e822c 306da248:NotInit 306d98c0:NotInit 306dc868:138690b0 <<
71ca0994 400007d 4 System.Int32 1 instance value__
我查看了应用程序域中的值,但它们只是逗号。
0:000> !DumpObj /d 0d8e822c
Name: System.Char[]
MethodTable: 71c9f54c
EEClass: 71874c84
Size: 14(0xe) bytes
Array: Rank 1, Number of elements 1, Type Char (Print Array)
Content: ,
Fields:
None
我需要做什么才能从堆上的对象中获取枚举的定义方式?
编辑1:如果这有影响的话,我可以访问 PDB。
最佳答案
先简单的事情:
0:000> !DumpObj /d 0d8e822c
[...]
Content: ,
您在这里所做的是:列出 enumSeperatorCharArray
的值。它与您的枚举定义无关。所有枚举都有它。
SOS IMHO 没有办法列出枚举定义。您需要sosex为了那个原因。
这是调试 session :
0:006> .loadby sos clr
0:006> .load D:\mylongpath\sosex.dll
0:006> !dumpheap -type YourEnum
Address MT Size
02cf2480 01154dc4 12
Statistics:
MT Count TotalSize Class Name
01154dc4 1 12 DebuggingEnumDefinition.YourEnum
Total 1 objects
所以只有一个对象,并且可以像您一样查看它。在输出的最后,您可以看到它的十进制值,即 65,并没有多大帮助。
0:006> !DumpObj /d 02cf2480
Name: DebuggingEnumDefinition.YourEnum
[...]
61bf42a8 4000001 4 System.Int32 1 instance 65 value__
使用 SOSEX 的 !mdt
,您可以列出枚举常量:
0:006> !mdt DebuggingEnumDefinition.YourEnum
DebuggingEnumDefinition.YourEnum
[s]enumSeperatorCharArray: char[]
AppDomain 'DebuggingEnumDefinition.exe' (00c8dc18): <uninitialized>
[s]enumSeperator: string
AppDomain 'DebuggingEnumDefinition.exe' (00c8dc18): <Field def not loaded>
value__: int
[s]EnumVal1: DebuggingEnumDefinition.YourEnum
AppDomain 'DebuggingEnumDefinition.exe' (00c8dc18): <Field def not loaded>
[s]EnumVal2: DebuggingEnumDefinition.YourEnum
AppDomain 'DebuggingEnumDefinition.exe' (00c8dc18): <Field def not loaded>
[s]EnumVal3: DebuggingEnumDefinition.YourEnum
AppDomain 'DebuggingEnumDefinition.exe' (00c8dc18): <Field def not loaded>
其实我也预料到了数值。
您还可以将 !mdt
与对象的地址一起使用,以便获得其常量和十六进制值 (0x41 == 65):
0:006> !mdt 02cf2480
0x41 (EnumVal3) (DebuggingEnumDefinition.YourEnum)
<小时/>
通过更改进程内存,您可能可以生成枚举值的映射。
以下生成从 0 到 127 的循环:
.for (r $t0=0; @$t0<0n128; r $t0 = @$t0+1) { }
在循环内,您可以更改枚举的值(我忘记了 +4 是否与位数相关):
ed 03402470+4 @$t0
接下来可以使用!mdt
来分析修改后的值
!mdt 03402470
完整的命令是
.for (r $t0=0; @$t0<0n128; r $t0 = @$t0+1) { ed 03402470+4 @$t0; !mdt 03402470}
输出将如下所示
0x0 (EnumVal1) (DebuggingEnumDefinition.YourEnum)
0x1 (EnumVal2) (DebuggingEnumDefinition.YourEnum)
0x2 (DebuggingEnumDefinition.YourEnum)
0x3 (DebuggingEnumDefinition.YourEnum)
[...]
0x7f (DebuggingEnumDefinition.YourEnum)
接下来,您可能只过滤有效的案例。请注意,我们可以通过包含 ) (
.
这就是 WinDbg 中的脚本变得有点难看的地方......
.echo Just a test
显示一些东西来说明原理。
.shell -ci ".echo Just a test" findstr "Just"
使用DOS命令findstr
来过滤包含特定单词的行。
接下来,将 .echo
替换为之前的完整命令,并将“Just”替换为 ) (
。因为 findstr
也是一个奇怪的程序,您实际上需要 ).(
因为否则它会将其视为两个单独的搜索词。
.shell -ci ".for (r $t0=0; @$t0<0n128; r $t0 = @$t0+1) { ed 03402470+4 @$t0; !mdt 03402470}" findstr ").("
yippieh,输出是:
0x0 (EnumVal1) (DebuggingEnumDefinition.YourEnum)
0x1 (EnumVal2) (DebuggingEnumDefinition.YourEnum)
0x41 (EnumVal3) (DebuggingEnumDefinition.YourEnum)
.shell: Process exited
真是一次冒险!
<小时/>我使用的源代码,以防万一......
using System;
using System.Collections;
namespace DebuggingEnumDefinition
{
class Program
{
static void Main()
{
var somwehere = new ArrayList() { YourEnum.EnumVal3 };
Console.WriteLine("There should be an enum on the heap now.");
Console.ReadLine();
Console.WriteLine(somwehere[0]); // Just fix the unused variable issue
}
}
enum YourEnum
{
EnumVal1,
EnumVal2,
EnumVal3=65
}
}
关于.net - 如何使用 SOS 和 Windbg 列出内存转储中的枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60212867/
我有一个 .NET .86 应用程序。我正在尝试从 cdb 运行 dumpdomain 但一直出现错误。 关于这个有很多问题,我尝试了几种变体: C:\Users\d.banks\Documents>
这个问题很大程度上是基于我之前找到的帖子 here . 我正在尝试使用反射重新创建 SOS.dll 的一些功能。特别是 ObjSize 和 DumpObject 命令。我使用反射来查找所有字段,然后如
我刚刚开始使用 windbg/sos,我创建了一个简单的控制台应用程序进行测试(抛出一个未处理的异常)。似乎在我加载 sos 之后,我会在下一次调用时遇到异常。 例如: ntsd consoleapp
嗨,SO 的智者。这是求救信号。 我遇到了很大的麻烦。在我的网络应用程序中有一个对象(假设它是对某事的请求)。用户提交他/她的请求。之后是可以批准/不批准该请求的人员。在从提交到批准/不批准的这段时间
我正在尝试使用 windbg 来研究在 x64 机器上为我们的 x86 进程创建的挂起转储文件。这是一个 4.0 x86 应用程序,所以为了获得非托管堆栈,我必须执行以下操作: .loadby sos
我现在正在将 SOS 调度程序从 sun solaris 迁移到 Oracle linux, SOS Berlin 调度程序是 1.5.3253 的最新版本 - Linux X64Java JDK 1
如何查看作为参数传入的日期时间? 我在互联网上找到了这个示例,但我在理解它时遇到问题?我根本看不到他们在哪里使用 clrstack 的输出,它只是说“通过向前转储 ESP 的内存来查看堆栈:” htt
如何在当前线程的 clrstack 上打印所有 System.String 对象的字符串值? 我想做的伪代码: foreach ($string in !dso -type System.String
我需要使用 WinDbg 调试 32 位托管应用程序,但是 WinDbg 顽固地拒绝加载 SOS.dll 扩展。经过许多互联网搜索和尝试后,我被难住了。我有使用 WinDbg 调试非托管代码的经验,但
我尝试在 vb.net 应用程序中加载 Visual Studio 2010 (.Net Framework 4) 中的 SOS 扩展,但没有成功。 首先我发现了以下article建议我在立即窗口中输
我使用了以下 sos 命令来枚举正在运行的 asp 应用程序(托管在 windows xp 4 GB 机器上)中特定类型的所有实例。 .foreach (obj { !dumpheap -type :
我制作了一个手电筒应用程序,现在我想添加 sos 莫尔斯电码闪烁。这是我的代码,但它工作得不太好,它闪烁得太快,所以我需要某种延迟,任何人都可以帮忙吗? public void sos(View v)
我正在通过 WinDBG 使用 SOS.dll 查看故障转储。给定一个 Dictionary 对象的地址,是否有一种简单的方法来转储它的内容,例如.. Key1 -> Value1 Key2 -> V
我正在尝试学习如何使用 Openlayers 和 SOS(传感器观察服务)服务。我在互联网上找到了几个例子,并研究了算法,但由于我对 Openlayers 库不太熟悉,而且我是 Javascript
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 7 年前。 Improve t
我有一个 ASP.net 2.0 应用程序,我正在尝试使用 Windbg 和 SOS.dll 对其进行实时调试。 当我将调试器附加到进程时,我看到它同时加载了 2.0 和 4.0 版本的 CLR。
我最近从 native 代码编程切换到托管代码编程。我正在使用.NET。 由于我使用 Windbg 已经有一段时间了,我也想将它用于托管代码调试。 我的搜索将我带到了 SOS(罢工之子)扩展程序,它似
当我在 Visual Studio 的即时窗口中使用 .load SOS 并无意中发出了导致一长串输出的命令(例如 !dumpheap -type System.String -min 100)时,即
有一个question with the same title但不幸的是它对我没有帮助。 我正在尝试解析 SOS 标记的数据。我能找到的所有文档都说在标记( 0xFFDA )之后是一个两字节的数字,它
“罢工之子”这个名字有何意义?它有什么意义还是只是听起来很酷? 最佳答案 杰森·赞德的blog post完美地解释了这一点: The original name of the CLR team (ch
我是一名优秀的程序员,十分优秀!