一个iOS静态库引发的思考

大家在制作静态库并加入demo中调试的时候,往往会碰到两个疑问:

  1. 调试的时候可以直接跟到库的源码里
  2. 断点堆栈信息里可以看到库内部的函数调用
    接下来我们就看看这其中发生了什么

问题1 为什么调试的时候可以跟到库的源码里

原因:这个问题直觉上应该是源文件的位置被记录下来了,但是记录在哪里并不太确定。后来使用文本编辑器查看了下二进制文件,发现里面确实记录了源文件的路径,同时相邻处还有XCode的安装目录和部分DEBUG信息。为了具体地确认这些信息所处位置,采用MACHOVIEW继续查看该文件,发现这些信息处于Section(__DWARF,__debug_str)段。

解决:有了上面的结论,很容易想到Build Settings里有个选项Generate Debug Symbols。于是把这个开关关上,重新编译并使用MACHOVIEW查看,发现Section(__DWARF,__debug_str)段已经没有了,拿到demo工程里调试,断点已经无法跟进源文件,问题解决。

另:虽然问题得到解决,但是我们发现在关掉Generate Debug Symbols选项后,编译出来的二进制文件同时丢掉了其他的debug信息。当然,如果仅仅是为了调试无法跟进源文件,只需要改变源码的位置就能解决。

问题2 为什么堆栈信息里可以看到库内部的函数调用

原因:这个问题应该就是二进制文件的符号表里包含了自定义库里写的方法。同样采用MACHOVIEW查看,在Symbol Table段里找到了我们写的方法以及对应的地址。

解决:那么如何去除符号表,很容易想到Build Settings里有个选项Strip Style。我们把Strip Style设为All Symbols,同时开启Deployment Postprocessing(只有在开启Deployment Postprocessing的情况下Strip Style才生效),编译之后再继续查看,惊讶地发现居然没用。在尝试了一些其他方法之后仍然没有找到原因,怎么办?

想到自己测试的静态库是采用Cocoa Touch Framework创建的,那么再试试Cocoa Touch Static Library吧。采用上面同样的配置进行编译,居然又报错了:

symbols referenced by relocation entries that can't be stripped in:`,

应该是部分符号不允许strip(具体没有深究)。那么继续修改Strip Style为Non-Global Symbols,再编译,成功之后查看,发现符号表里已经没有自定义的方法。把最新生成的静态库拿到demo工程中调试,发现堆栈中显示unnamed_symbol。看来这样做是能够去除符号信息的,那么为什么Cocoa Touch Static Library创建的库(后面简称Lib库)可以做到,而Cocoa Touch Framework创建的库(后面简称Framework库)却不行呢?我们继续查找原因。

查看Lib库的最后一次Build日志,我们发现Build的最后一个步骤是Strip libxxx.a,调用的命令是strip -x libxxx.a。同时查看Framework库的编译日志,发现并没有Strip这个步骤,也就是说我们的设置并没有生效。那么应该怎么做呢,我尝试了一些其他的方法,但是并没有找到解决方法,看来只能尝试手动Strip了。我们对编译完成之后framework里的二进制文件调用strip -x在进行测试,发现确实是可行的,问题得到解决。

另:在设置了Strip Style之后,我们发现二进制文件里的Debug信息也会被清除,也就是说解决问题2的同时问题1也解决了。

其他问题

  1. 为什么framework库设置strip style不生效
  2. 为什么部分symbole不可以strip,部分可以

参考:

  1. Build Setting Reference
  2. Xcode中和symbols有关的几个设置- 简书
  3. 什么是debug symbols
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容