通过 SOS 调查 CLR

2023-12-29

目前,我正在深入研究 CLR,并尝试找到托管对象的适当大小。

我有两种简单的类型:

XClass

    class XClass
{
    public XStruct StructField = new XStruct();
    public int IntField;
    public double DoubleField;
}

and XStruct

struct XStruct
{
    public short ShortField;
    public long LongField;
}

还要考虑涉及此对象的代码片段:

static unsafe void Main(string[] args)
{
    double angle = 0.34;

    {
        double anotherDouble = 1.49;

        XStruct xStruct = new XStruct();
        xStruct.ShortField = 12;
        xStruct.LongField = 1234567890;

        XClass classObject = new XClass();
        classObject.DoubleField = angle + anotherDouble;
        classObject.IntField = 123;
        classObject.StructField = xStruct;

        <<<<<<<<BREAKPOINT>>>>>>>

        xStruct.ShortField = 3;
    }

    double* ptr = &angle;

    Console.WriteLine(*(ptr - 1));
    Console.ReadKey();
}

因此,我尝试获取有关放置在堆栈中的 XStruct 的一些信息,但我在那里找不到它。

!dso
PDB symbol for clr.dll not loaded
OS Thread Id: 0x1f94 (8084)
ESP/REG  Object   Name
0018EF1C 0260252c ConsoleApplication2.XClass
0018EF20 0260252c ConsoleApplication2.XClass
0018F290 0260252c ConsoleApplication2.XClass
0018F2C4 0260251c System.Object[]    (System.String[])
0018F2E0 0260252c ConsoleApplication2.XClass
0018F2E8 0260252c ConsoleApplication2.XClass
0018F30C 0260251c System.Object[]    (System.String[])
0018F3C0 0260251c System.Object[]    (System.String[])
0018F51C 0260251c System.Object[]    (System.String[])
0018F554 0260251c System.Object[]    (System.String[])
0018FA90 02601238 System.SharedStatics

请解释原因ConsoleApplication2.XStruct不显示,为什么ConsoleApplication2.XClass在堆栈中显示为对象。我认为 XClass(作为普通引用类型)应该放置在堆中。或者可能是我的理解!dso是不正确的。

Thanks.


!dso == 转储堆栈对象。关注“对象”,结构不是对象。

SOS 能够找到对象引用的唯一原因是它可以使用编译方法时抖动生成的元数据。当垃圾收集器执行堆栈遍历以查找回对象引用时,垃圾收集器将使用此数据。您可以阅读更多相关信息这个答案 https://stackoverflow.com/a/17131389/17034。此元数据中缺少值类型值,GC 不关心它们。

您可以通过创建结构体数组来推断结构体的大小,并为结构体的第一个字段赋予一个独特的值。用VS调试器查看数组,Debug + Windows + Memory + Memory1,将变量名放在Address字段中。您将结构值返回到十六进制转储中,位于数组头之后。请注意,结构大小取决于 CLR 版本和进程的位数,因此仅将此信息用作提示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 SOS 调查 CLR 的相关文章

随机推荐

  • 当查找列表的最后一个但第二个元素时,为什么使用“last”是其中最快的?

    下面给出了 3 个函数 它们查找列表中最后一个但第二个元素 那个使用的是last init看起来比其他人快得多 我似乎不明白为什么 为了进行测试 我使用了输入列表 1 100000000 一亿 最后一个几乎立即运行 而其他则需要几秒钟 sl
  • 默认声音在 Android v9 中不播放,但在 Android v7 上运行 - ionic v3 cordova 推送插件

    I am using FCM to send notification on my app below are the screenshots how I am doing As you can see I enabled the soun
  • 将字节数组转换为双精度数的问题

    我在使用以下方法将字节数组转换为双精度数组时遇到问题BitConverter ToDouble 简而言之 我的程序将选择一个图像 然后将图像转换为字节数组 然后它将把字节数组转换为双精度数组 问题是 当我将字节数组转换为双精度数组时 我会在
  • 如果两个阶段使用相同的 RDD,spark 是否会读取同一个文件两次?

    在 Spark 中 如下代码 rdd sc textfile file path rdd1 rdd filter filter1 maptopair rdd2 rdd filter filter2 maptopair rdd3 rdd1 j
  • Android ProgressDialog 的样式

    我正在尝试定制ProgressDialog风格有类似的东西 我拥有的 我知道如何更改微调器的样式和颜色 但我不明白的是 如何制作圆角 我正在尝试使用android radius属性 但是没有任何变化 而且不知道如何减少padding 也许我
  • ASP.NET-MVC 2 数据注释字符串长度

    我可以使用 MVC 2 DataAnnotations 指定字符串字段的最小长度吗 有没有人这样做过或者他们创建了自定义属性 如果是的话 您介意分享源吗 如果您使用的是 asp net 4 0 则可以使用 StringLength 属性来指
  • 获取页面上选定的文本和选定的节点?

    当选择文本块 可能跨越许多 DOM 节点 时 是否可以使用 Javascript 提取所选文本和节点 想象一下这个 HTML 代码 h1 Hello World h1 p Hi b there b p 如果用户从 World 开始启动 mo
  • 在 IIS 10 中注册 asp.net

    我有一个与在 IIS 10 中注册 asp net 有关的问题 我的环境是Windows 10 IIS 10 安装了VS 2013和VS 2015 NET 3 5是Windows功能中的一个功能 我想在iis中使用nettcpbinding
  • Spring Security OAuth2 登录重定向到错误页面,尽管成功

    为了不泄露机密信息 提供商将被替换为 PROVIDER 授权有效 但它没有将我重定向到索引 而是将我重定向到 error 重现步骤 启动应用程序 进入任何页面 它会将我重定向到http localhost oauth login显示一个链接
  • 如何为每个箱线图设置不同的颜色

    我正在尝试在 VSCode 中制作 Seaborn 箱线图 我的代码基于这里的示例 here https github com bvalgard Boxplots blob master Boxplots ipynb 我专门制作了类似倒数第
  • Tkinter 帮助查看器

    我有一个简单的 Python Tkinter 应用程序 我想向其中添加帮助文档 将帮助查看器集成到应用程序的最简单方法是什么 最好是跨平台的 尽管我主要使用 Windows 我可以想象用纯 HTML 编写帮助 或者只是启动外部网络浏览器 使
  • 密码保护 Android 应用程序的启动

    我正在寻找一种在启动时用密码保护我的 Android 应用程序的方法 即当启动 恢复属于我的 apk 包的活动时 将显示密码对话框 我已经尝试了一些方法 扩展应用类 http developer android com reference
  • 在Excel中,使用VBA,如何获取“路径+文件名+扩展名”并更改扩展名?

    有一个动态生成 Excel 文件和 csv 的程序 excel 文件具有 加载时 加载 csv 数据的 VBA 代码 我想通过让 csv 文件具有相同的文件名但扩展名不同来动态调用该 csv 因此 根据我的理解 如果 xls 文件在这里 C
  • MS Access 直通查询到 SQL Server 需要什么字符清理

    我正在尝试将 MS Access 与 SQL Server 连接 并且我想确保我不会受到 SQL 注入攻击 我看到过使用 ADO 创建查询的参数化版本的建议 但我想了解如何通过 DAO 传递来清理我的输入 目前我正在转义单引号和反斜杠 VB
  • 在 Github 上分叉 Pull 请求

    有效分叉 Pull 请求的正确工作流程是什么 为了解释用例 我找到了一个存储库 其中包含一个添加了我需要的功能的拉取请求 不幸的是 拉取请求作者已经擅离职守 并且存储库所有者在编写测试之前不会接受拉取请求 我想 分叉 拉取请求并编写测试 以
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • Windows 上具有大型数组的 Python 多处理

    我使用python的多处理模块在linux平台上编写了一个脚本 当我尝试在 Windows 上运行该程序时 它不能直接工作 我发现这与 Windows 上如何生成子进程有关 所使用的物品是否可以腌制似乎至关重要 我的主要问题是 我正在使用大
  • 通过 CLI 的 AWS DynamoDB put-item 类型无效(unicode v. dict)

    我想通过命令行向我的 DynamoDB 表添加一个项目 但遇到了类型错误 我尝试添加的数据非常简单 id 1 我运行的命令同样简单 aws dynamodb put item table name my table item id 1 我收
  • required_if Laravel 5 验证

    我有用户可以填写的表格来出售他们的房屋 对于其中一项输入 用户必须选择 出售 或 出租 如果是出售 则会出现两个价格输入字段 如果是出租 则会出现基于 jQuery 的其他价格输入字段 我的问题是我希望价格字段是必需的 但是例如 如果我选择
  • 通过 SOS 调查 CLR

    目前 我正在深入研究 CLR 并尝试找到托管对象的适当大小 我有两种简单的类型 XClass class XClass public XStruct StructField new XStruct public int IntField p