Xcode调试之View Memory(查看内存)
Posted WoodBear009
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode调试之View Memory(查看内存)相关的知识,希望对你有一定的参考价值。
借着最近在工作中遇到的一个问题,简单来讲讲如何使用xcode的view memory功能来查看数据,排查问题。
问题描述:
和服务器进行socket通信,但客户端这边发现服务器发过来的一个信令在反解、结构化后,有一个字段的数值和约定的对应不上,双方都先排查了一下各自代码,都没有发现明显的问题,导致现在无法定位问题引入的源头。于是决定客户端这边拿到反解、结构化之前,服务器发过来的原始数据,看看到底是传过来的时候数据就是错的,还是因为客户端这边反解、结构化时引入的错误。
数据格式:
数据组成:msgId(4字节)+cntLen(4字节)+value1(32字节)+value2(4字节)
约定好正确的数据应该是msgId=0x00020007, value2=1,结果目前客户端这边反解出来的结果是value2=3,所以下面我们就借助view memory来看看服务器传过来的原始数据(value2的值)到底是否正确。
调试:
在数据接收过来,尚未做任何处理时打上断点。原始数据目前都存在指针_buff指向的内存空间中。右键选择view memory of "*_buff",注意不要选择上面的view memory of "_buff",view memory of "_buff"查看的是指针本身(_buff)在内存中的存储,而我们真正关心的是指针指向的(*_buff)数据内容在内存中的存储。
显示出以下数据浏览窗口,
最左边紫色框内显示的是内存地址,地址以十六进制表示编号,内存的基本单位是字节(8bit),每一个字节对应一个地址。数据表每一行显示出20字节的数据,7FF53B011600、7FF53B011614、7FF53B011628都是每一行第一个字节数据对应的内存地址编号。启始地址(7FF53B011600)就是_buff指针指向的第一个字节数据的内存地址;
中间区域展示的是每块内存地址中的具体数据,同样以十六进制表示。看红色下划线标记的第一组数据07 00 02 00.十六进制07,进行二进制展开即0000 0111,正好是一个字节(8bit),它对应的地址即是7FF53B011600。后面00对应的地址为7FF53B011601、02对应的地址为7FF53B011602......以此类推。
右侧黑色框区域内显示是对每个字节内数据进行ASCII编码后内容,如果你的数据本身不遵循ASCII编码规则,大部分情况下都是乱码,对我们排查问题没啥帮助,可忽略。
翻过头来看我们的数据定义,一上来应该是4个字节的msgId,那么对应的就是07 00 02 00。正确的数据应该是(0x)00 02 00 07,数都对上了,但数据顺序却是反的,这就涉及到了big endian与little endian的概念,有兴趣的同学可以去了解下,这里因为采用的是little endian,低端地址存放低字节数据,所以数据看上去正好反了过来,msgId获取正确。
下面看看我们最关心的value2服务器传过来的是否正确。按照数据定义,msgId与value2直接隔着4个字节的cntLen与32个字节的value1,上图中从07 00 02 00往后数4个字节,即黄色下划线标记的即是cntLen,再数32个字节,蓝色下划线标记的即是value1.最后,绿色下划线标记的即是我们要关注的value2了,03 00 00 00,可以看到,服务器传过来的就是3.......
好了,问题明确定位在了服务端,拿着这个数据去找服务器那边的同事让他们排查一下,最终问题解决。
以上是关于Xcode调试之View Memory(查看内存)的主要内容,如果未能解决你的问题,请参考以下文章
Xcode Memory Graph - 显示内存使用量增加 - 它到底显示了啥?
Xcode8的调试技能Memory Graph 实战解决闭包引用循环问题