一. binder调试信息

1.1 binder_thread

调用方法:print_binder_thread

thread 8980: l 12 //tid=8980,looper=12

关于looper状态值:

BINDER_LOOPER_STATE_REGISTERED  = 0x01, // 创建注册线程BC_REGISTER_LOOPER
BINDER_LOOPER_STATE_ENTERED     = 0x02, // 创建主线程BC_ENTER_LOOPER
BINDER_LOOPER_STATE_EXITED      = 0x04, // 已退出
BINDER_LOOPER_STATE_INVALID     = 0x08, // 非法
BINDER_LOOPER_STATE_WAITING     = 0x10, // 等待中
BINDER_LOOPER_STATE_NEED_RETURN = 0x20, // 需要返回

所以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()

例如:

node 3079465: u0000005593cc3540 c0000005593f37030 hs 1 hw 1 ls 0 lw 0 is 1 iw 1 proc 8963

含义:

  • 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()

//含义:ref `debug_id`:`desc` `node` `node->debug_id` `strong` `weak` `death`
ref 340122: desc 1 node 340121 s 1 w 1 d ffffffc04f90a340

输出binder_ref结构体成员变量:

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

1.4 binder_buffer

调用方法: print_binder_buffer()

//含义:buffer `debug_id`:`data` `data_size`:`offsets_size` `transaction`
buffer 3473176: ffffff8007700218 size 0:0 delivered

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

1.5 binder_transaction

print_binder_transaction

static void print_binder_transaction(struct seq_file *m, const char *prefix,struct binder_transaction *t)
{seq_printf(m,"%s %d: %p from %d:%d to %d:%d code %x flags %x pri %ld r%d",prefix, t->debug_id, t,t->from ? t->from->proc->pid : 0,t->from ? t->from->pid : 0,t->to_proc ? t->to_proc->pid : 0,t->to_thread ? t->to_thread->pid : 0,t->code, t->flags, t->priority, t->need_reply);if (t->buffer == NULL) {seq_puts(m, " buffer free\n");return;}if (t->buffer->target_node)seq_printf(m, " node %d",t->buffer->target_node->debug_id);seq_printf(m, " size %zd:%zd data %p\n",t->buffer->data_size, t->buffer->offsets_size,t->buffer->data);
}

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

二. mediaserver

    USER      PID   PPID  VSIZE  RSS   WCHAN              PC  NAMEmedia     8814  1     128376 16068 binder_thr 00f6da2db0 S /system/bin/mediaservermedia     9304  8814  128376 16068 binder_thr 00f6da2db0 S Binder_1media     9305  8814  128376 16068 binder_thr 00f6da2db0 S Binder_2media     22609 8814  128376 16068 binder_thr 00f6da2db0 S Binder_3

2.1 stats

proc 8814threads: 8requested threads: 0+2/15ready threads 4free async space 520192nodes: 13refs: 14 s 14 w 14buffers: 0pending transactions: 0

进程mediaserver:

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

2.2 proc/8814

proc 8814thread 8814: l 12thread 9294: l 00thread 9296: l 00thread 9297: l 00thread 9299: l 00thread 9304: l 12thread 9305: l 11thread 22609: l 11

三. servicemanager

单线程的进程:

system    435   1     3872   1040  binder_thr 7fb462bcd4 S /system/bin/servicemanagerproc 435threads: 1requested threads: 0+0/0ready threads 1free async space 65536nodes: 1refs: 130 s 130 w 0buffers: 0pending transactions: 0proc 435thread 435: l 12node 1: u0000000000000000 c0000000000000000 hs 1 hw 1 ls 1 lw 1 is 72 iw 72 proc ...

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

四. system_server

system    8963  8794  2337380 139776 SyS_epoll_ 7f950f2be4 S system_server
system    8980  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_1
system    8981  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_2
system    9407  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_3
system    9411  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_4
system    9472  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_5
system    9513  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_6
system    9590  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_7
system    9591  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_8
system    9592  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_9
system    9594  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_A
system    9596  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_B
system    9860  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_C
system    9862  8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_D
system    10074 8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_E
system    10081 8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_F
system    10082 8963  2337092 138556 binder_thr 7f950f2cd4 S Binder_10

4.1 stats

proc 8963threads: 50requested threads: 0+15/15ready threads 16free async space 520192nodes: 596refs: 951 s 950 w 950buffers: 3pending transactions: 0

进程system_server:

- 处于ready状态的binder线程个数为16:
- BC_ENTER_LOOPER创建1个binder线程
- BC_REGISTER_LOOPER创建15个binder线程

4.2 proc/8963

proc 8963thread 8963: l 00thread 8976: l 00thread 8980: l 12thread 8981: l 11...buffer 3263909: ffffff8007700150 size 8:0 deliveredbuffer 3468983: ffffff80077001a8 size 24:8 deliveredbuffer 3473176: ffffff8007700218 size 0:0 delivered

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

五. surfaceflinger

system    492   436   192320 21360 binder_thr 7f99cffcd4 S Binder_2
system    3068  436   192320 21360 binder_thr 7f99cffcd4 S Binder_3
system    4063  436   192320 21360 binder_thr 7f99cffcd4 S Binder_4
system    8317  436   192320 21360 binder_thr 7f99cffcd4 S Binder_5

5.1 stats

proc 436threads: 8requested threads: 0+4/4ready threads 5free async space 520192nodes: 50refs: 6 s 5 w 6buffers: 0pending transactions: 0...

进程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

  proc 436thread 436: l 00thread 490: l 12thread 492: l 11thread 499: l 00thread 500: l 00thread 3068: l 11thread 4063: l 11thread 8317: l 11node 3079465: u0000005593cc3540 c0000005593f37030 hs 1 hw 1 ls 0 lw 0 is 1 iw 1 proc 8963node 3076788: u0000005593f270d0 c0000005594049818 hs 1 hw 1 ls 0 lw 0 is 2 iw 2 proc 9687 8963...ref 18: desc 0 node 1 s 1 w 1 d           (null)ref 340122: desc 1 node 340121 s 1 w 1 d ffffffc04f90a340...

已知该进程有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线程上限.

原文地址: http://gityuan.com/2016/09/03/binder-debug-3/

Binder子系统之调试分析(三)相关推荐

  1. Binder子系统之调试分析(二)

    一. 概述 上一篇文章已经介绍了binder子系统调试的一些手段,这篇文章再来挑选系统几个核心服务进程来进行分析. 1.1 创建debugfs 首先debugfs文件系统默认挂载在节点/sys/ker ...

  2. Binder子系统之调试分析(一)

    一. 概述 在博客以前有写过关于binder系列,大概写了10篇关于binder的文章,从binder驱动,到native层,再到framework,一路写到app层的使用.有兴趣的可以看看 Bind ...

  3. linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  4. tcp/ip 协议栈Linux内核源码分析八 路由子系统分析三 路由表

    内核版本:3.4.39 Linux路由子系统代码量虽说不是很多,但是难度还是有的,最近在分析路由子系统这一块,对它的框架有了基本的了解,如果要想掌握的话估计还得再花点时间阅读代码,先把框架记录下来.路 ...

  5. ue4场景没阴影_UE4性能调试分析常用方法

    UE4性能调试分析常用方法 本文将介绍使用UE4开发项目常用到的性能分析的命令 UE4使用命令的方式是在游戏运行的时候按~键就可以输入命令了 显示CPU和GPU端执行耗时命令: stat UNIT 这 ...

  6. 《软件调试分析技术》学习笔记

    <软件调试分析技术>学习笔记(一) 今天开始写写一些心得体验. <软件调试分析技术>是好友Monster的处女作品.作为一直以的好伙伴,他是我看着长大的,(*^__^*) 嘻嘻 ...

  7. Nouveau源码分析(三):NVIDIA设备初始化之nouveau_drm_probe

    Nouveau源码分析(三) 向DRM注册了Nouveau驱动之后,内核中的PCI模块就会扫描所有没有对应驱动的设备,然后和nouveau_drm_pci_table对照. 对于匹配的设备,PCI模块 ...

  8. Nouveau源代码分析(三):NVIDIA设备初始化之nouveau_drm_probe

    Nouveau源代码分析(三) 向DRM注冊了Nouveau驱动之后,内核中的PCI模块就会扫描全部没有相应驱动的设备,然后和nouveau_drm_pci_table对比. 对于匹配的设备,PCI模 ...

  9. JS 调试分析 + 字体解析(汽车之家)

    JS 调试分析 + 字体解析(汽车之家) 当你看到这篇文章,讲一堆理论和基础,你一定会很烦..直接开始,上图!!(需要使用一个工具:FontCreator..如何下载,自己搜!)        惊不惊 ...

最新文章

  1. 如何成为顶尖管理者?
  2. SQLServer DBA 三十问
  3. c++ 实现录音并且指定到文件_2020年的办公装备新选择,搜狗AI录音笔E1深度评测...
  4. Android 渗透测试学习手册 第七章 不太知名的 Android 漏洞
  5. 北工商计算机考研难吗,北京工商大学考研难吗?一般要什么水平才可以进入?...
  6. java爬虫登录_Java爬虫中怎么爬取需要登录的网站
  7. java retainall_Java Set retainAll()用法及代码示例
  8. AI芯片:Edge TPU(谷歌出品)【在边缘(edge)设备上运行的“专用集成芯片”】【量化操作:Edge TPU使用8 位权重进行计算,而通常使用32位权重。所以我们应该将权重从32位转换为8位】
  9. 关于数据采集的配置方法
  10. Marlin固件的欢迎界面
  11. Zynga就收购顶尖移动设备游戏《Toon Blast》和《Toy Blast》的开发商伊斯坦布尔Peak公司达成协议
  12. 4.1.1 OS之初识文件管理概念和功能
  13. baidu手机卫兵给开发者生态带来新想像空间
  14. python字母对应数字上海迪士尼残疾人门票_所有景点提供无障碍设施 残障人士也能玩转上海迪士尼...
  15. ​抖音怎么养号容易热门,一机两卡养抖音号可以吗
  16. ♠♦♣TypeScript
  17. 小学生计算机的起源与发展ppt,计算机的起源与发展历程ppt课件.ppt
  18. linux查看mysql日志信息,Linux下查看mysql错误日志
  19. Java高并发和多线程的面试笔试题——稳拿offer
  20. linux上java项目链接不上mysql,本地测试无问题

热门文章

  1. salt stack 工具之一——远程命令
  2. Cygwin的安装,卸载,以及安装gdb
  3. 条款五:对应的new和delete要采用相同的形式
  4. 求指定范围内的所有素数C++代码实现
  5. 苹果x防水测试软件,iPhone终极防水测试 iPhone XR阵亡
  6. Android app集成Google Map方法
  7. [云炬创业基础笔记]第十一章创业计划书测试11
  8. 吴恩达《序列模型》精炼笔记(2)-- NLP和Word Embeddings
  9. 有监督回归:鲁棒学习
  10. JQUERY获取各种HTML控件的值