之前写了一篇文章《追踪 Objective-C 方法中的 Block 参数对象》,利用 BlockHook 和 Objective-C 的动态特性实现对 block 对象执行和销毁的追踪。本文在此基础上,通过 Mach-O 文件格式获取 Mangle Name 并根据 Clang 源码实现对其解析,探寻如何追踪 block 代码定义的位置。

主要代码已经整合到 BlockHook 1.0.2 版本中。

Read More

很多方法最后一个参数是类似于 completionBlock 这种回调,然而有些 API 实现一些异常逻辑时会忘记调用传入的 Block 参数(当然这肯定是 bug 啦),或者存在多次调用。在调试的时候可能会碰到这种大坑,需要追踪下 Block 参数何时调用了,甚至是否调用过。如果不方便直接在 Block 实现中加代码,或者没有源码的情况下,就需要无侵入式地追踪 Block 参数对象。

BlockTracker 可以追踪方法调用时传入的 Block 类型的参数的执行和销毁。基于 BlockHook 实现。本文讲述了它的使用方法和实现原理。

Read More

本文通过参照 MABlockClosure 的实现和 Aspects 的 API 设计,基于 libffi 实现了对 Objective-C Block 的 hook。GitHub 地址:https://github.com/yulingtianxia/BlockHook

什么场景下需要 hook block 呢?在有源码的情况下,大部分程序员会选择直接在 block 中插代码。假如方法 A 的入参是个 block 对象,方法 A 将 block 传给方法 B,C…等。如果只有方法 A 的源码,上层传入的 block 和下层方法实现都是黑盒的话,想追踪 block 调用的时机,打印些 log,就得 hook 这个 block 对象了。

Read More