我正在运行 Xcode,我想转储 NSData*。有问题的变量是缓冲区。有没有办法通过 UI 或 GDB 调试器来做到这一点?
编辑
我已将笔记移至答案中。
从来没有人正确回答过这个问题。两年后,我想是时候换一个了:)
假设你的代码中有
NSData* myData;
然后在 lldb 中输入
me read `[myData bytes]` -c`[myData length]`
如果转储的格式不符合您的喜好,您可以添加“-t”例如
me read `[myData bytes]` -c`[myData length]` -t int
如需更多帮助,请输入
help me read
在LLDB
从 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]
在 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."
在 Swift 中这应该可以解决问题:
po String(data:buffer!, encoding: NSUTF8StringEncoding)
右键单击
buffer
,然后单击 Print description of "buffer"
。
控制台应该说
Printing description of buffer:
<your data here ...>
不幸的是,到目前为止,所有建议都没有解决实际能够快速显示 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
您的数据实例是空。
否则它不仅会显示地址。
-[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
方法。
我想我现在已经拥有了。
右键单击显示列表中的 NSData,然后单击“显示“x”的内存”。
我将此发布为this相关问题的答案:
放置断点后,运行,程序在断点处停止,将光标悬停在您想要查看的变量/值上,如下所示:
您还可以放置
NSLog(@"%@", yourLabel.text);
来查看该标签/其他对象类型的内容。
另一种选择是在控制台中运行 GDB,如下所示:
gdb
attach <your process name>
然后使用
po
(打印对象)命令查看变量的值,如下所示:
po variableName
要查看基本类型(
int
、float
、long
、double
、char
等)的值,您可以在控制台中运行 GDB 时使用 print
命令,如下所示:
print yourPrimitiveVariable
希望这有帮助!
编辑:
使用
po
命令,您可以使用属性名称 (self.myProperty
) 或 ivar 名称(可能是 _myProperty
)打印出对象的值。我在这里演示这一点:
对我来说最简单的方法(仅在本地开发期间!)是转换为未使用的
NSString
实例。然后这些值就会显示在调试器中。完成后,我会删除这些代码行。
来自这个旧线程
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
对于斯威夫特
po String(data: data, encoding: .utf8)