Hubble是一个method-tracing系统,在所有支持的和即将由华为制造的安卓设备上运行,以帮助调试性能问题。 Hubble instruments every non-inlined bytecode method’s entry and exit,以记录method的名称和时间戳。 trace points被记录到一个内存中的环形缓冲器中,旧的数据会不断被覆盖。 这些数据只有在检测到性能问题时才会被保存下来,使工程师在检测到异常情况之前就能及时获得宝贵的、详细的运行时间数据。
Challenge and Opportunities
需要一个能够提供细粒度观察的生产追踪系统。然而,生产中的连续跟踪是具有挑战性的。
- 开销小
- 不访问其源代码的情况下跟踪应用程序
- 它需要易于维护
三个贡献
- Android应用程序通常是以字节码的形式下载的,然后被编译或解释
- Hubble利用这个runtime environment,自动地将其跟踪逻辑嵌入到编译的二进制或解释的逻辑中。避免了jmp,同时纯黑盒。
- 将trace point写入内存中的环形缓冲区,只有在检测到问题时才会刷新。
- 用汇编写的performance-sensitive instrumentation logic
Overview
- Hubble修改了编译器和解释器,在每一个非内联字节码方法的入口和出口处都配备了追踪逻辑,无论它是解释的、提前编译的、JIT编译的还是重新编译的。
- Hubble在每个应用程序的进程中增加了一个系统线程,即跟踪控制线程,它可以打开或关闭同一进程中任何线程的跟踪。
- 在每个方法的开始和退出时,Hubble的追踪代码都会向一个固定大小的内存环形缓冲区写一个条目。
- 当缓冲区满的时候,缓冲区指针会wrap around,所以最古老的数据会被覆盖掉。
- 当性能异常检测器检测到一个性能问题时,控制线程将被通知。然后,它通知UI线程停止跟踪,以防止在问题发生之前有用的debug数据被覆盖。
- 一旦停止追踪,控制线程就会将环形缓冲区刷入磁盘,然后再重新开始追踪。
- 每个被追踪的线程都会写到一个属于自己的私有环形缓冲区。Hubble在系统中最多保留N个缓冲区,来自最近在前台执行的N个线程。较旧的缓冲区将被系统回收。