日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2025/3/15 windows 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Binder子系统之调试分析(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 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); }

接下來,分別說說系統中幾個常見進程:surfaceflinger,?mediaserver,?servicemanager,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,代表的是等待就緒狀態

六. 小結

  • mediaserver和servicemanager的主線程都是binder線程;?surfaceflinger和system_server的主線程并非binder線程
  • binder線程分為binder主線程和binder普通線程, binder主線程一般是binder_1或者進程的主線程.
  • cat /d/binder/stats和cat /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子系统之调试分析(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。