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 调试器向我显示对象的底层内存。
根据 Alexander 和 hippietrail 的评论,
message.payload
属于 Data
类型:
message.payload
至 NSData
bytes
属性Data
有多种不同的后备存储策略(例如,一种用于切片,一种用于桥接到 Objective C 等)
0x40006000022804b0
包含一个 Foundation.__DataStorage
对象。它有一个 _bytes 属性,这是实际缓冲区所在的位置。它已公开 -[NSData bytes]
,您可以将其打印出来用于调试目的
根据Data.swift,Swift
Foundation.Data
有4种类型:
InlineData
InlineSlice
LargeSlice
-> 你在这里看起来是: 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 数据内存布局的图和详细示例: