Xcode的linkmap文件分析
Xcode的linkmap文件分析
1. 获得linkmap文件
在工程中的Build Setting中搜索map,使能Linking下的选项“Write Link Map File”为“Yes”。并在“Path to Link Map File”中设置LinkMap文件的路径,或直接使用默认设置。
2. 找到路径
编译工程,在工程左侧最底下的Products目录中查看.app文件,右键show in finder。参照以下默认路径,找出xxx-LinkMap-xxx.txt
/Users/xxxx/Library/Developer/Xcode/DerivedData/project-fftqybbbfgbbhmhfjpzgdschwatw/Build/Intermediates/project.build/Debug/project.build/project-LinkMap-normal-x86_64.txt
3. 分析LinkMap文件
该LinkMap文件与嵌入式项目中的map文件类似,可用来查看整个内存的分配情况,所有变量的分布等。
3.1 # Object files: 目标文件列表
列出.o类型的目标文件
列出.tbd类型的文件,按照路径来看,是framework和lib类在编译时形成的目标文件;.tbd类型之前没有接触过,需要查一下。
3.2 # Sections: 段表
描述各个段在最后编译成的可执行文件中的偏移位置及大小,包括了代码段(__TEXT,保存程序代码段编译后的机器码)和数据段(__DATA,保存变量值)
# Address Size Segment Section
0x100001A60 0x00002721 __TEXT __text
......
......
其中,__text表示编译后的程序执行语句,__data表示已初始化的全局变量和局部静态变量,__bss表示未初始化的全局变量和局部静态变量,__cstring表示代码里的字符串常量,等。
3.3 # Symbols: 符号变量表
按每个文件列出每个对应字段的位置和占用空间
# Address Size File Name
0x100001A60 0x00000060 [ 2] _hexToDec
0x100001AC0 0x00000059 [ 2] _decToHex
0x100001B20 0x00000046 [ 3] _main
0x100001B70 0x000002D0 [ 4] _testArrayPoint
...... // 以上为一些文件的信息
0x100005A48 0x00000008 [ 4] _pp
0x100005A50 0x00000050 [ 4] _p1
...... // 以上为一些变量的信息
首列是数据在文件的偏移地址,第二列是占用大小,第三列是所属文件序号,对应上述Object files列表,最后是名字。
例如pp实际为代码中定义的一个指针,该指针地址 = 0x100005A48,对于64bit处理器来说,pp长度即size = 8Byte,所处文件为[4]号,从该段起始处文件信息中可以看出,[4]号文件名 = testArrayPoint。实际该变量也是定义在这个文件中的。
4. 总结
在开发嵌入式项目的经验中,尤其当指针跑飞、异常中断、变量值莫名改变以及代码空间受限时,经常有机会查看map文档,对于调试内存数据类问题非常有用。
以上为简单的查看Xcode项目的LinkMap文件的方法,与嵌入式项目一样,查看该文档依然有用。
浙公网安备 33010602011771号