27

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

这是我在运行时看到的

编辑

我已将笔记移至答案中。

4

12 回答 12

38

从来没有人正确回答过这个问题。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 中

于 2014-12-03T22:52:12.607 回答
24

从 Xcode 5 (lldb) 开始,您可以使用以下内容:

po (NSString *)[[NSString alloc] initWithData:buffer encoding:4]

请注意,这假设您的 NSData 实例是用 编码的NSUTF8StringEncoding,但您可以在标头或文档中查找其他值。

因此,如果您正在调试包含在 中的 JSON 请求之类的内容NSURLSessionDataTask,则请求数据位于 中task.originalRequest.httpBody,您可以在调试器中使用

po (NSString *)[[NSString alloc] initWithData:task.originalRequest.HTTPBody encoding:4]
于 2014-02-17T05:45:22.263 回答
16

在 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."
于 2013-10-28T03:34:29.323 回答
8

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

po String(data:buffer!, encoding: NSUTF8StringEncoding)
于 2016-03-31T07:55:37.457 回答
6

右键单击buffer并单击Print description of "buffer"

控制台应该说

Printing description of buffer:
<your data here ...>
于 2012-07-17T22:06:05.397 回答
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

于 2012-08-13T14:45:26.633 回答
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] <01020a04 0f>

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

(NSData *) $1 = 0x00007f98da500180 <01020a04 0f>

安树建议的上下文菜单路径也使用了这种description方法。

于 2012-07-17T22:27:38.080 回答
1

我想我现在有了。

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

于 2012-07-17T22:36:05.850 回答
1

我将其发布为对此相关问题的回答:

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

在此处输入图像描述

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

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

gdb
attach <your process name>

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

po variableName

要查看原始类型(intfloatlongdoublechar等)的值,您可以print在控制台中运行 GDB 时使用该命令,如下所示:

print yourPrimitiveVariable

希望这可以帮助!

编辑:

使用该命令,您可以使用属性名称 ( ) 或 ivar 名称 (可能)po打印出对象的值。我在这里演示:self.myProperty_myProperty

在此处输入图像描述

于 2012-07-17T22:40:01.727 回答
1

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

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

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

Xcode 数据视图

于 2020-05-17T20:17:51.833 回答
0

对我来说最简单的方法(仅在本地开发期间!)是转换为未使用的NSString实例。然后值会立即显示在调试器中。完成后,我会删除这些代码行。

从这个旧线程

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

在此处输入图像描述

于 2014-08-02T16:45:29.040 回答
0

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

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

在此处输入图像描述

之后我可以看到data内容:

在此处输入图像描述

于 2018-12-23T09:33:21.697 回答