点赞评论,希望能在你的帮助下越来越好
作者:@iOS成长指北,本文首发于公众号 iOS成长指北,欢迎各位前往指正
如有转载需求请联系我,记住一定要联系哦!!!
这是我参与更文挑战的第2天,活动详情查看:更文挑战
当我们在记录 APP 启动过程中动态库加载的时机时,我们可以通过设置一些环境变量来达到这个效果,
在 dyld 的源代码中说明了部分环境变量的调用时机,例如:
// 如果设置了DYLD_PRINT_OPTS则调用printOptions()打印参数
if (sEnv.DYLD_PRINT_OPTS)
printOptions(argv);
// 如果设置了DYLD_PRINT_ENV则调用printEnvironmentVariables()打印环境变量
if (sEnv.DYLD_PRINT_ENV)
printEnvironmentVariables(envp);
这里我们列举一些常见的环境变量,希望有助于你在调试过程中获取更多的信息:
| 环境变量 | 描述 |
|---|---|
DYLD_PRINT_LIBRARIES | 加载镜像时的记录 |
DYLD_PRINT_LIBRARIES_POST_LAUNCH | 记录由于 dlopen 调用而加载镜像的时间——包括动态库的从属库 |
DYLD_PRINT_APIS | 记录使动态加载程序返回符号地址的调用 |
DYLD_PRINT_STATISTICS | 记录有关应用程序启动过程的统计信息,例如,应用程序启动完成后加载了多少镜像 |
DYLD_PRINT_STATISTICS_DETAILS | 更详细的应用层序启动过程的统计信息 |
DYLD_PRINT_INITIALIZERS | 记录动态加载程序何时调用构造函数程序和析构函数 |
DYLD_PRINT_SEGMENTS | 记录在动态加载程序将动态库的一部分映射到当前进程的地址空间时 |
DYLD_PRINT_BINDINGS | 记录动态加载程序将未定义的外部符号与其定义绑定时 |
DYLD_PRINT_APIS | dyld 的 API 调用 |
DYLD_PRINT_ENV | 初始环境变量。 |
DYLD_PRINT_OPTS | 将命令行选项转储到文件描述符2(通常是标准错误)。 |
然后,按下图所示添加环境变量 DYLD_PRINT_OPTS 并设置 Value 为 1。
在启动优化的时候,我们可以根据 DYLD_PRINT_STATISTICS 来获取动态库的加载时间
Total pre-main time: 821.85 milliseconds (100.0%)
dylib loading time: 379.71 milliseconds (46.2%)
rebase/binding time: 147.25 milliseconds (17.9%)
ObjC setup time: 48.93 milliseconds (5.9%)
initializer time: 245.95 milliseconds (29.9%)
slowest intializers :
libSystem.B.dylib : 4.40 milliseconds (0.5%)
libMainThreadChecker.dylib : 30.37 milliseconds (3.6%)
**** : 342.37 milliseconds (41.6%)
这里,我们比较一下 DYLD_PRINT_STATISTICS 和 DYLD_PRINT_STATISTICS_DETAIL 两个不同环境变量打印出的不同的数据
total time: 2.9 seconds (100.0%)
total images loaded: 597 (571 from dyld shared cache)
total segments mapped: 92, into 11518 pages
total images loading time: 2.1 seconds (73.3%)
total load time in ObjC: 52.01 milliseconds (1.7%)
total debugger pause time: 1.7 seconds (61.3%)
total dtrace DOF registration time: 0.00 milliseconds (0.0%)
total rebase fixups: 1,817,950
total rebase fixups time: 138.64 milliseconds (4.7%)
total binding fixups: 994,179
total binding fixups time: 325.93 milliseconds (11.2%)
total weak binding fixups time: 9.36 milliseconds (0.3%)
total redo shared cached bindings time: 325.35 milliseconds (11.1%)
total bindings lazily fixed up: 0 of 0
total time in initializers and ObjC +load: 248.60 milliseconds (8.5%)
libSystem.B.dylib : 4.32 milliseconds (0.1%)
libBacktraceRecording.dylib : 4.88 milliseconds (0.1%)
libobjc.A.dylib : 3.67 milliseconds (0.1%)
libMainThreadChecker.dylib : 32.03 milliseconds (1.1%)
**** : 338.86 milliseconds (11.6%)
total symbol trie searches: 1925414
total symbol table binary searches: 0
total images defining weak symbols: 69
total images using weak symbols: 143
DYLD_PRINT_STATISTICS_DETAIL 能够打印出更多的动态库相关的信息,当你在启动优化遇到瓶颈,想在动态库上面进行更深入的分析时,可以试一试这个。
参考资料
Dynamic Library Programming Topics: developer.apple.com/library/arc…
如果你有任何问题,请直接评论,如果文章有任何不对的地方,请随意表达。如果你愿意,可以通过分享这篇文章来让更多的人发现它。
感谢你阅读本文! 🚀