孙同生的博客

为美好的世界献上祝福

fishhook简介

C 语言往往会给我们留下不可修改的这一印象,而 fishhook 是一个由 facebook 开源的第三方框架,其主要作用就是动态修改 C 语言函数实现

这个框架的代码其实非常的简单,只包含两个文件:fishhook.c 以及 fishhook.h;两个文件所有的代码加起来也不超过 300 行。不过它的实现原理是非常有意思并且精妙的

fishhook 提供非常简单的两个接口以及一个结构体:

1
2
3
4
5
6
7
8
9
10
11
struct rebinding {
const char *name;
void *replacement;
void **replaced;
};

int rebind_symbols(struct rebinding rebindings[], size_t rebindings_nel);

int rebind_symbols_image(void *header,intptr_t slide,
struct rebinding rebindings[],
size_t rebindings_nel);

我们可以从 fishhook 提供的demo中上手实践一下,这里的demo对 close 进行修改:

阅读全文 »

概览

本次来学习下Mach-O文件的格式,Mach-O(Mach Object File Format) 是针对不同运行时可执行文件的文件类型。

文件类型:

Executable: 应用的主要二进制
Dylib: 动态链接库(又称 DSO 或 DLL)
Bundle: 不能被链接的 Dylib,只能在运行时使用 dlopen() 加载,可当做 macOS 的插件。

Mach-O 文件格式如下:

阅读全文 »

编译器

把一种编程语言(原始语言)转换为另一种编程语言(目标语言)的程序叫做编译器

大多数编译器由两部分组成:前端和后端。

  • 前端负责词法分析,语法分析,生成中间代码;
  • 后端以中间代码作为输入,进行行架构无关的代码优化,接着针对不同架构生成不同的机器码。

Objective C/C/C++使用的编译器前端是clang,swift是swift,后端都是LLVM。

llvm介绍

LLVM是什么,是low level virtual machine的简称,其实是一个编译器框架。LLVM 的优点主要得益于它的三层式架构 – 第一层支持多种语言作为输入(例如 C, ObjectiveC, C++ 和 Haskell),第二层是一个共享式的优化器(对 LLVM IR 做优化处理),第三层是许多不同的目标平台(例如 Intel, ARM 和 PowerPC)。编译器前端主要进行语法分析,语义分析,生成中间代码。编译器后端会进行机器无关的代码优化,生成机器语言,并且进行机器相关的代码优化,根据不同的系统架构生成不同的机器码。

现在,Xcode 的默认编译器是 clang。本文中我们提到的编译器都表示 clang。clang 的功能是首先对 Objective-C 代码做分析检查,然后将其转换为低级的类汇编代码:LLVM Intermediate Representation(LLVM 中间表达码)。接着 LLVM 会执行相关指令将 LLVM IR 编译成目标平台上的本地字节码,这个过程的完成方式可以是即时编译 (Just-in-time),或在编译的时候完成。而Clang 是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。它的目标是提供一个GNU编译器套装(GCC)的替代品。Clang项目包括Clang前端和Clang静态分析器等。

下图是iOS编译过程:

阅读全文 »

你是否曾经苦恼于理解项目的代码,而去尝试打印一个变量的值?然后使用NSLog 并且每次必须重新编译,从头开始?但是不一定要这么做。你可以使用调试器。而且即使你已经知道如何使用调试器检查变量,它可以做的还有很多。

LLDB 是什么?

LLDB是Mac OS X上Xcode的默认调试器,支持再桌面和iOS设备和模拟器上调试C ,Objective-C和C++。它是新一代高性能调试器,它可以高效利用LLVM项目中的现有库,例如Clang表达式解析器和LLVM反汇编程序。

随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。LLDB为Xcode提供了底层调试环境,其中包括内嵌在Xcode IDE中的位于调试区域的控制面板。

Chisel 是facebook下一个开源LLDB命令集合。

与此同时,让我们以在调试器中打印变量来开始我们的旅程吧。

阅读全文 »

直播原理

一个简单的直播流程是:

1
2
app        -> 视频采集   ->  编码    -> 推流     -> 服务器
服务器 -> 拉流 -> 解码 -> 播放 -> app

其中涉及到的技术点比较多:

阅读全文 »

记录这周看到值得分享的事,本期就分享点图片压缩工具类吧~

image-tool-stack

上图是我的图片处理工具栈,矢量原型 Sketch,位图编辑 Pixelmator,搜集管理 Inboard,压缩优化 JPEGmini、ImageAlpha、ImageOptim。前四个是付费 App,后两个自由开源。

本次主要分享ImageOptim ImageAlpha ImageOptim-CLISquoosh

阅读全文 »

结合Instrument CoreAnimation分析影响性能的因素: 图层混合,光栅化,颜色格式,图片大小,离屏渲染

在使用UIKit的过程中,性能优化是永恒的话题。很多人都看过分析优化滑动性能的文章,但其中不少文章只介绍了优化方法却对背后的原理避而不谈,或者是晦涩难懂而且读者缺乏实践体验的机会。不妨思考一下下面的问题自己是否有一个清晰的认识:

  1. 为什么要把控件尽量设置成不透明的,如果是透明的会有什么影响,如何检测这种影响?
  2. 为什么cell中的图片,尽可能要使用正确的大小、格式,如果错误会有什么影响,如何检测这种影响?
  3. 为什么设置阴影和圆角有可能影响滑动时流畅度?
  4. shouldRasterize和离屏渲染的关系是什么,何时应该使用?
阅读全文 »

介绍一下使用查看 CPU 性能图形性能内存性能,要执行Instruments需要先在Xcode 中对当前的项目做 Profile (Command-I :

阅读全文 »

CoreLocation - iOS定位

使用 CoreLocation 框架定位,基本分为权限获取,位置更新,区域检测,iBeacon,方向检测,地理编码几方面。

demo链接: Location_Demo

iOS的定位支持

GPS卫星定位

其原理就是:利用天上的卫星(24颗工作卫星和数颗备份星)不断地广播信号, 地面的GPS接收设备收到信号后, 通过分析多个卫星信号,就可以计算出地球坐标, GPS保证全球任何一个地方(98%)都可以同时收到至少4个卫星的信号, 从而可以准确确定您的经纬度以及海拔位置(三颗星只能获得经纬度,四颗星还可以获得海拔高度)。GPS定位精度可达10米以内

阅读全文 »

Instruments 是什么

Instruments 是 Xcode 的一个工具集,为我们提供了强大的程序性能分析及测试能力。使用 Instruments 你可以做下面这些事:

阅读全文 »
0%