iOS代码染色原理及技术实践

本文介绍了iOS代码染色的工作流程,重点探讨编译阶段的IR文件插桩,涉及LLVM编译器、Clang前端、LLVM IR和插桩逻辑。通过LLVM,开发者可以为不同语言生成中间码,实现代码覆盖率分析,为测试和质量保证提供支持。
摘要由CSDN通过智能技术生成

背景

随着业务的迅速发展,业务代码逻辑的复杂度增加。QA测试的质量对于产品上线后的稳定性更加重要。一般QA测试的工作流程分为两大项:自动化测试和人工测试。这两种测试后都需要得到代码覆盖率。自动化测试的覆盖率,在双端都有比较成熟的方案。

本文着重介绍人工测试过程中,怎么得到对应的代码覆盖率。涉及到的技术主要是代码染色。以下会先介绍整体的工作流程,再对涉及到的技术一一阐述。

染色流程

流程图中涉及到了双端的关键节点以及技术点。我们重点介绍编译阶段。

  • 编译阶段:生成染色包 (对IR文件插桩)

需要在编译中增加编译选项,编译后会为每个可执行文件生成对应的 .gcno文件。

  • 运行阶段:生成二进制覆盖率文件。

在测试代码中调用覆盖率分发函数,会生成对应的 .gcda文件。

  • 解析阶段:将二进制覆盖率文件可视化。

 

编译阶段

在上文可以看出,编译阶段最核心的操作是对IR文件进行插桩。

什么是IR文件?插桩逻辑是什么?我们往下看。

语言处理系统

一个完整的语言处理系统中,从源程序到可执行的机器代码,如下图所示,历经几个重要模块。而我们上文提到的IR文件,是编译器模块中的产物,插桩处理也是在这个模块中进行。这里重点讨论下编译器。

编译器

说起编译器,我们了解到的传统编译器架构分为前端、优化器和后端。

传统编译器的劣势是:前端和后端没有完全分离,耦合在了一起,因而如果要支持一门新的语言或硬件平台,需要做大量的工作。一种更加灵活,适应性更好的编译器套件应运而生——LLVM.

LLVM

官网:http://www.aosabook.org/en/llvm.html

LLVM是一个开源的,模块化和可重用的编译器和工具链技术的集合,或者说是一个编译器套件。

可以使用LLVM来编译Kotlin,Ruby,Python,Haskell,Java,D,PHP,Pure,Lua和许多其他语言。

LLVM核心库还提供一个优化器,对流行的CPU做代码生成支持。

LLVM同时支持AOT预先编译和JIT即时编译。

2012年,LLVM获得美国计算机协会ACM的软件系统大奖,和UNIX,WWW,TCP/IP,Tex,JAVA等齐名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值