如何在 Xcode 中检查“Foundation.Data”字节缓冲区中包含的字节?

问题描述 投票:0回答:3

我无法让 Xcode 显示

Foundation.Data
的底层内存。

我正在解析一个二进制格式,该格式作为

Data
中的 blob 传递给我的函数。在调试器 Xcode 中向我展示了这个:

我可以按住 Control 键单击其中任何一个,然后选择“查看“数据”内存”等,但它们都没有显示我正在查找的内存块。 (我知道这一点是因为我

print()
通过下标运算符
data[0]
等访问的前几个字节)

  • _representation
    显示地址
    0x0
  • slice
    (1) 显示了我的记忆,但不是我正在寻找的内容
  • slice
    (2)向我展示了与上一个相同的
  • lowerBound
    向我展示了与前两个相同的
  • upperBound
    向我展示了一些其他记忆,而不是我正在寻找的
  • storage
    显示地址
    0x0

我习惯了更像 C 的语言,在那里我有一个指针或数组。

我还尝试过逐步进行反汇编,同时查看代码索引到数据的寄存器,但我不习惯 ARM asm,并且似乎也找不到我正在寻找的地址。

(不,这不是

0x40006000022804b0
的记忆)


期望的行为

查看

Data

封装的字节

具体问题或错误

当我使用上下文菜单“查看...的内存”时,调试器呈现给我的

Data
的每个组件都没有显示任何内容或字节,而是我正在寻找的内容

以及重现问题所需的最短代码

这个问题与我的代码无关。这是关于如何让 Xcode 调试器向我显示对象的底层内存。

swift xcode macos debugging foundation
3个回答
2
投票

根据 Alexanderhippietrail 的评论,

message.payload
属于
Data
类型:

  • Cast 数据表达式,即
    message.payload
    NSData
  • 从中获取
    bytes
    属性
  • 右键单击表达式,选择“打印 (message.payload as NSData).bytes 的描述”
  • 复制打印的十六进制地址
  • 调试->调试工作流程->查看内存
  • 将复制的地址粘贴到“地址”文本框中,然后按回车键

1
投票

Data
有多种不同的后备存储策略(例如,一种用于切片,一种用于桥接到 Objective C 等)

0x40006000022804b0
包含一个
Foundation.__DataStorage
对象。它有一个 _bytes 属性,这是实际缓冲区所在的位置。它已公开
-[NSData bytes]
,您可以将其打印出来用于调试目的


0
投票

Swift 数据类型

根据Data.swift,Swift

Foundation.Data
有4种类型:

  • 内联 =
    InlineData
  • 切片 =
    InlineSlice
  • 大=
    LargeSlice

您的案例:InlineSlice

-> 你在这里看起来是: InlineSlice

-> 你的数据的内存布局(也许):

  • 您的数据(
    InlineSlice
    )
    • Int32 slice
      • 0x00009AE000000000
        • 39648
          ==
          0x9AE0
    • __DataStorage* storage
      • 0x40006000022804b0

__DataStorage
详情

->对于

storage
=
__DataStorage
=
0x40006000022804b0
,其布局为:

class __DataStorage {
    var isa: objc_class* // NULL for pure Swift class
    var refCount: UInt64
    var _bytes: UnsafeMutableRawPointer?
    var _length: UInt64
    var _capacity: UInt64
    var _offset: UInt64
    var _deallocator: ((UnsafeMutableRawPointer, Int64) -> Void)?
    var _needToZero: Bool
}

您可以通过

__DataStorage
命令查看
lldb
内存数据详细信息,例如:

x/8xg 0x40006000022804b0

Swift 数据内存布局和示例

我画了一张关于 Swift 数据内存布局的图和详细示例:

© www.soinside.com 2019 - 2024. All rights reserved.