Android systrace/atrace 缺少事件,跟踪中不可能的状态

Android systrace/atrace is missing events, impossible states in traces

我目前正在 Android 上使用 atrace 来记录和分析视频工作负载期间 OS 的状态。具体来说,我在整个执行过程中监视系统的 BufferQueue 大小。 atrace 记录这些缓冲区的大小,因为它们 queued/acquired 随着时间的推移。

然而,在我的一些痕迹中,这导致了不可能的情况。 C|171|SurfaceView|x 行将 'x' 表示为缓冲区中排队的纹理数。例如,有时在单次获取期间,两个缓冲区被删除而不是一个(这应该是不可能的):

     Binder_5-4526   (  171) [002] ...1  1621.656462: tracing_mark_write: B|171|queueBuffer
     Binder_5-4526   (  171) [002] ...1  1621.656493: tracing_mark_write: C|171|SurfaceView|2
surfaceflinger-171   (  171) [002] ...1  1621.664886: tracing_mark_write: B|171|acquireBuffer
surfaceflinger-171   (  171) [002] ...1  1621.664978: tracing_mark_write: C|171|SurfaceView|0

在 Android 的平台代码(例如 https://android.googlesource.com/platform/frameworks/native/+/android-5.0.1_r1/libs/gui/BufferQueueConsumer.cpp)的 BufferQueueConsumer.cpp 文件中,查看 acquireBuffer 函数。

在某些情况下(例如,缓冲区已过期),函数可能会决定从队列中删除缓冲区。没有此事件发生的跟踪指示,您只会看到缓冲区的大小从 2 跳到 0。

也有可能出现紧密交错的 queueBuffer/acquireBuffer 命令,它们会打印一些意外的缓冲区大小转换。