Binder 子系统之调试分析(三)

一. binder调试信息

1.1 binder_thread

调用方法:print_binder_thread

关于looper状态值:

所以0x12 = BINDER_LOOPER_STATE_ENTERED | BINDER_LOOPER_STATE_WAITING,代表的是等待就绪状态且由为binder主线程. 简单说,looper值, 十位为1代表处于binder_thread_read()状态, 个位为1代表已注册的binder线程,个位为2代表binder主线程.

1.2 binder_node

关于binder_node的输出信息:print_binder_node()

例如:

含义:

  • debug_id = 3079465
  • ptr = u0000005593cc3540
  • cookies = c0000005593f37030
  • has_strong_ref(hs) = 1
  • has_weak_ref(hw) = 1
  • local_strong_refs(ls) = 0
  • local_weak_refs(lw) = 0
  • internal_strong_refs(is) = 1
  • count: (node->refs总引用次数) = 1
  • proc: (node->refs->proc->pid) = 8963

1.3 binder_ref

调用方法: print_binder_ref()

输出binder_ref结构体成员变量:

  • node是指当 ref->node->proc为空则代表node已死亡,采用deadnode,否则node.
  • death: 应用注册死亡通知时,此域不为空.

1.4 binder_buffer

调用方法: print_binder_buffer()

输出的便是binder_buffer结构体的成员变量,其中transaction不为空,则为active,否则为delivered.

1.5 binder_transaction

print_binder_transaction

接下来,分别说说系统中几个常见进程:surfaceflinger, mediaserver, servicemanager,system_server

二. mediaserver

2.1 stats

进程mediaserver:

  • 处于ready状态的binder线程个数为4:
  • BC_ENTER_LOOPER创建2个binder线程
  • BC_REGISTER_LOOPER创建2个binder线程

2.2 proc/8814

三. servicemanager

单线程的进程:

该binder_thread是由BC_ENTER_LOOPER所创建的binder主线程, 只有一个binder_node对象, 被72个进程所使用.servicemanager作为服务管家,被系统大量进程所使用.

四. system_server

4.1 stats

进程system_server:

4.2 proc/8963

8976作为binder主线程,已使用的binder buffer个数为3.

五. surfaceflinger

5.1 stats

进程surfaceflinger:

  • 处于ready状态的binder线程个数为5:
  • BC_ENTER_LOOPER创建1个binder主线程
  • BC_REGISTER_LOOPER创建4个binder线程
  • max_threads = 4
  • binder_thread个数为8
  • 已分配的buffer个数为0

5.2 proc/436

已知该进程有8个binder_thread,其中

  • 4个线程处于0x11 = BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_WAITING,代表的是等待就绪状态
  • 1个线程处于0x12 = BINDER_LOOPER_STATE_ENTERED | BINDER_LOOPER_STATE_WAITING,代表的是等待就绪状态

六. 小结

  • mediaserverservicemanager的主线程都是binder线程; surfaceflingersystem_server的主线程并非binder线程
  • binder线程分为binder主线程和binder普通线程, binder主线程一般是binder_1或者进程的主线程.
  • cat /d/binder/statscat /d/binder/proc/<pid>是分析系统binder状态的重要信息.

本文举例的这几个重要进程情况:

进程 max BC_REGISTER_LOOPER BC_REGISTER_LOOPER
surfaceflinger 4 4 1
mediaserver 15 2 2
servicemanager 0 1 0
system_server 15 15 1

BC_REGISTER_LOOPER + BC_ENTER_LOOPER = max + 1,则代表该进程中的binder线程已达上限。 可见, mediaserver具有继续创建新线程的能力,而其他几个进程都以达到可创建的binder线程上限.

作者微博:@Gityuan

原文出处:Gityuan.com

1 收藏 评论

关于作者:gityuan

Android系统工程师,www.gityuan.com博主,个人新浪微博:http://weibo.com/gityuan 个人主页 · 我的文章 · 3 ·     

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部