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

621 查看

一. 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