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



我目前在Android上使用atrace来记录和分析视频工作负载期间操作系统的状态。具体来说,我在整个执行过程中监视系统的BufferQueue大小。atrace记录这些缓冲区随时间排队/获取的大小。

然而,在我的一些痕迹中,这导致了不可能的情况。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平台代码中的BufferQueueConsumer.cpp文件中(例如。,https://android.googlesource.com/platform/frameworks/native/+/android-5.0.1_r1/libs/gui/BufferQueueConsumer.cpp),检查acquireBuffer函数。

在某些情况下(例如,缓冲区已过期),函数可能会决定从队列中删除缓冲区。没有任何迹象表明该事件正在发生,您只会看到缓冲区的大小从2跳到0。

还有可能使用紧密交错的queueBuffer/acquisiteBuffer命令,在这些命令中打印一些意外的缓冲区大小转换。

相关内容

  • 没有找到相关文章

最新更新