在Xcode中查看NSData内容

时间:2012-07-17 21:47:50

标签: objective-c xcode

我正在运行Xcode,我想转出一个NSData *。有问题的变量是缓冲区。有没有办法通过UI或GDB调试器来做到这一点?

This is what I see at runtime

修改

我已将笔记移到答案中。

12 个答案:

答案 0 :(得分:35)

没有人能正确回答这个问题。 2年后,我认为现在是时候了:)

假设你的代码中有

NSData* myData;

然后在lldb中输入

me read `[myData bytes]` -c`[myData length]`

如果转储的格式不符合您的喜好,您可以添加' -t'例如

me read `[myData bytes]` -c`[myData length]` -t int

如需更多帮助,请输入

help me read
lldb中的

答案 1 :(得分:22)

从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]

答案 2 :(得分:15)

在lldb中,以下内容可让您检查NSData对象的内容:

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

p (void *)[buffer bytes]

你看到这样的事情:

(void *) $32 = 0x0b5e11f0

如果您知道基础数据是字符串,则可以执行以下操作:

p (char *)[buffer bytes]

并且调试器将输出:

(char *) $33 = 0x0b5e11f0 "This is the string in your NSData, for example."

答案 3 :(得分:5)

右键点击buffer,然后点击Print description of "buffer"

控制台应该说

Printing description of buffer:
<your data here ...>

答案 4 :(得分:4)

不幸的是,迄今为止没有任何建议解决了实际能够在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);
    }
}

NsLog输出

0:24
1:0
2:4个
3:0
4:0
5:0

答案 5 :(得分:2)

在Swift中,这应该可以解决问题:

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

答案 6 :(得分:1)

您的数据实例为空

否则它不仅会显示地址。 -[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 PrintDat [61264:403]&lt; 01020a04 0f&gt;

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

  

(NSData *)$ 1 = 0x00007f98da500180&lt; 01020a04 0f&gt;

Anshu建议的上下文菜单路由也使用description方法。

答案 7 :(得分:1)

我想我现在拥有它。

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

答案 8 :(得分:1)

我发布此信息是对this相关问题的回答:

一旦你设置断点,运行,程序在断点处停止,将光标悬停在你想要看到的变量/值上:

enter image description here

您还可以放置NSLog(@"%@", yourLabel.text);来查看该标签/其他对象类型的内容。

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

gdb
attach <your process name>

然后使用po(print-object)命令查看变量的值,如下所示:

po variableName

要查看基本类型(intfloatlongdoublechar等)的值,您只需使用在控制台中运行GDB的print命令如下:

print yourPrimitiveVariable

希望这有帮助!

编辑:

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

enter image description here

答案 9 :(得分:0)

对我来说最简单的方法(仅限本地开发!)是转换为未使用的NSString实例。然后值显示在调试器中。一旦我完成了,我就会编写这些代码行。

从此old thread

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

enter image description here

答案 10 :(得分:0)

对于Swift代码,我正在执行以下操作:

当我的程序在断点处停止时,我使用“添加表达式”选项并输入[UInt8](data),其中data是我的Data实例:

enter image description here

之后,我可以看到data的内容:

enter image description here

答案 11 :(得分:0)

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

通过Swift进行了测试,但大概也可以使用C系列语言。

(注意:“眼睛”图标会产生下面的输出,其格式正确,但是,呃……似乎缺少最后一列字节了?)

Xcode data view