Objective c 在Xcode中查看NSData内容

Objective c 在Xcode中查看NSData内容,objective-c,xcode,Objective C,Xcode,我正在运行Xcode,我想转储一个NSData*。所讨论的变量是缓冲区。有没有办法通过UI或GDB调试器来实现这一点 编辑 我已将笔记移到答案中。右键单击buffer,然后单击打印“buffer”的说明。 控制台应该说 Printing description of buffer: <your data here ...> 打印缓冲区说明: 您的数据实例为空 否则它不仅会显示地址-[NSData description]包括数据内容的打印输出。字节分为四个,并以十六进制打印,前导

我正在运行Xcode,我想转储一个NSData*。所讨论的变量是缓冲区。有没有办法通过UI或GDB调试器来实现这一点

编辑


我已将笔记移到答案中。

右键单击
buffer
,然后单击
打印“buffer”的说明。

控制台应该说

Printing description of buffer:
<your data here ...>
打印缓冲区说明:
您的数据实例为空

否则它不仅会显示地址<代码>-[NSData description]包括数据内容的打印输出。字节分为四个,并以十六进制打印,前导0占位符:

char arr[] = {0x1, 0x2, 0xA, 0x4, 0xF};
NSData * dat = [NSData dataWithBytes:arr length:5];
NSLog(@"%@", dat);
2012-07-17 22:24:48.973打印数据[61264:403]

在调试器的命令行中使用
po-dat
将得到相同的结果,包括地址:

(NSData*)$1=0x00007f98da500180

Anshu建议的上下文菜单路径也使用了
描述
方法。

我想我现在有了它


右键单击此处显示的列表中的NSData,然后单击“显示“x”的内存”。

我将此作为相关问题的答案发布:

放置断点后,运行,程序在断点处停止,将光标悬停在希望看到的变量/值上,如下所示:

gdb
attach <your process name>
po variableName
print yourPrimitiveVariable
p (void *)[buffer bytes]
(void *) $32 = 0x0b5e11f0

您还可以放置一个
NSLog(@“%@”,yourLabel.text)
以查看该标签/其他对象类型的内容

另一个选项是在控制台中运行GDB,如下所示:

gdb
attach <your process name>
po variableName
print yourPrimitiveVariable
p (void *)[buffer bytes]
(void *) $32 = 0x0b5e11f0
要查看基本类型的值(
int
float
long
double
char
等),您可以在控制台中运行GDB时使用
print
命令,如下所示:

gdb
attach <your process name>
po variableName
print yourPrimitiveVariable
p (void *)[buffer bytes]
(void *) $32 = 0x0b5e11f0
希望这有帮助

编辑:

使用
po
命令,您可以使用属性名称(
self.myProperty
)或ivar名称(可能是
\u myProperty
)打印对象的值。我在这里说明这一点:


不幸的是,到目前为止,这些建议都没有解决能够在NSData中快速显示数据的问题

我写了一个简单的方法,按照我需要的方式工作。在GDB窗口中,我可以输入
print[Util dumpData:theData]
,我将得到漂亮的格式化输出

+(void) dumpData:(NSData *)data
{
    unsigned char* bytes = (unsigned char*) [data bytes];

    for(int i=0;i< [data length];i++)
    {
        NSString* op = [NSString stringWithFormat:@"%d:%X",i,bytes[i],nil];
        NSLog(@"%@", op);
    }
}
+(void)dumpData:(NSData*)数据
{
无符号字符*字节=(无符号字符*)[数据字节];
对于(int i=0;i<[数据长度];i++)
{
NSString*op=[NSString stringWithFormat:@“%d:%X”,i,字节[i],nil];
NSLog(@“%@”,op);
}
}
NsLog输出

0:24
1:0
2:4
3:0
4:0

5:0

在lldb中,以下功能可用于检查NSData对象的内容:

您可以获取字节的地址,以便与以下各种调试器命令一起使用:

gdb
attach <your process name>
po variableName
print yourPrimitiveVariable
p (void *)[buffer bytes]
(void *) $32 = 0x0b5e11f0
你会看到这样的情况:

gdb
attach <your process name>
po variableName
print yourPrimitiveVariable
p (void *)[buffer bytes]
(void *) $32 = 0x0b5e11f0
如果知道基础数据是字符串,则可以执行以下操作:

p (char *)[buffer bytes]
调试器将输出:

(char *) $33 = 0x0b5e11f0 "This is the string in your NSData, for example."
在Xcode 5(lldb)中,您可以使用以下内容:

po (NSString *)[[NSString alloc] initWithData:buffer encoding:4]
请注意,这假设您的NSData实例是使用
NSUTF8StringEncoding
编码的,但您可以在标题或文档中查找其他值

因此,如果您正在调试封装在
NSURLSessionDataTask
中的JSON请求,则请求数据位于
task.originalRequest.httpBody
中,您可以使用

po (NSString *)[[NSString alloc] initWithData:task.originalRequest.HTTPBody encoding:4]
对我来说(仅在本地开发期间!)最简单的方法是转换为未使用的
NSString
实例。然后,这些值将显示在调试器中。一旦我完成了,我就去核那些代码行

由此


从来没有人正确回答过这个问题。两年后,我想是时候来一次了:)

假设代码中有

NSData* myData;
然后在lldb中键入

me read `[myData bytes]` -c`[myData length]`
如果转储的格式不符合您的喜好,您可以添加'-t'例如

me read `[myData bytes]` -c`[myData length]` -t int
如需更多帮助,请键入

help me read

在lldb中

在Swift中,这应该可以做到:

po String(data:buffer!, encoding: NSUTF8StringEncoding)

对于
Swift
code,我将执行以下操作:

po (NSString *)[[NSString alloc] initWithData:buffer encoding:4]
当我的程序在断点处停止时,我使用“添加表达式”选项并输入
[UInt8](数据)
其中
数据
是我的
数据
实例:

之后我可以看到
数据
内容:

Xcode 11.4(可能更早)支持在可视化调试器中检查(NS)数据的原始字节。在分配数据后设置断点,将光标悬停在符号上,直到弹出窗口出现,然后单击“眼睛”或“信息”图标。灵活地滚动,以防止弹出窗口通过移动到微小目标之外而向您关闭

使用Swift进行测试,但可能也适用于C族语言

(注意:眼睛图标产生的输出下面的格式很好,但是,嗯…似乎缺少最后一列字节?)


你在LLDB中试过“po缓冲区”吗?@ratburn我在GDB中试过。我有一个号码,大概是地址。现在在谷歌上搜索LLDB.Bugger,我肯定我曾经看到过NSData的内容,因此感到震惊。我只是不记得我是怎么做的,抱歉。明白了:右键单击此处显示列表中的NSData,然后单击显示x的内存。我正试图完成相同的任务,但使用Swift NSData变量。。。创建了另一个问题-我尝试了这个,但我只得到了“打印缓冲区描述:”这句话,然后没有输出。小心!这是对象的内存,而不仅仅是它包装的数据,显示器只显示从变量地址开始的特定大小的数据块——不一定是整个对象,只是对象。@Josh Caswell这是我看到的-不是内部数组中包含的数据。Josh,它肯定越来越多,但我可能做错了。好的,看起来里面应该有5个字节。长度是多少