| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> android Tombstone 流程 -> 正文阅读 |
|
[移动开发]android Tombstone 流程 |
一 总述下面是一份dump 的log:
涉及到的模块有: 1 system_server 2 debuggerd 3 target_pid 4 crash_dump 5 debuggerd_client 6 tombstoned 1和2 system_server 和debuggerd都是调用的5 debuggerd_client 实现的。 二者区别: system_server 可能是写到文件中的,如anr文件; debuggerd是打印到标准输出上STDOUT_FILENO 3 target_pid 与4?crash_dump 是同一个code,3 target_pid会在fork出来一个进程(就是4 crash_dump)实现dump? trace的功能 总体实现方法是: 1 各进程间的通信是使用socket实现的。 2 当建立socket 通信后,debuggerd_client会发送signal 给target_pid,target_pid使用signal catcher处理对应的signal信号,就是crash_dump逻辑了。 二? ANR触发dump trace信息举例system server中的逻辑:抓anr的trace信息 watchdog里面会监控system server主要service的状态,如果发生anr就会监控到,然后调用ActivityManagerService.dumpStackTrace API,。 这个api中会有需要dump的进程信息,其中watchdog中指定dump的native 进程,ams 还会其他check的extra 进程。 然后for循环dump每个进程的trace信息。 ams>android_os_Debug>debuggerd_client.dump_backtrace_to_file_timeout>debuggerd_trigger_dump 这些API都是在system_server 进程中。 debuggerd进程的实现也依赖这个debuggerd_trigger_dump。 debuggerd_trigger_dump 就是在debuggerd_client中实现的了。后面再介绍。 三 tombstoned 进程开机就会启动的进程, 创建三个socket: constexpr char kTombstonedCrashSocketName[] = "tombstoned_crash"; 1 tombstoned与debuggerd_client?的通信是使用socket "tombstoned_intercept"。 debuggerd_client 向tombstoned_intercept发送InterceptRequest 请求,tombstone中的intercept_manager 处理该请求,并返回intercept的状态,如register/started/failed等。 2 tombstoned 与crash_dump的通信使用socket “tombstoned_crash” 或“tombstoned_java_trace”,这个是根据dump的type决定的。 crash_dump建立联系后,向tombstoned发送kDumpRequest 请求,然后tombstoned返回kPerformDump,并同outputfd一块返回。 所以tombstoned逻辑中会有两个逻辑:一个是处理intercept(使用intercept_manager)另一个是处理crash_request. 四 crash_dump64 进程这个是dump进程的东西,往dump进程中发送signal 信息,这边就会收到signal 信号,然后由signal 处理程序处理。 然后fork一个进程专门处理dump的功能。 在新进程中, 1与tombstoned 建立socket 通信, 2 发送kDumpRequest并等待kPerformDump。 3 dump的逻辑 4 通知dump conplete 五 总体流程A tombstone 进程启动,创建好三个socket B 各进程启动,加载signal catcher C 出现anr情况, system server watchdog 逻辑monitor 问题,触发ams.dumpstacktrace 然后就是上图的流程了 复杂的是tombstoned的消息处理逻辑: intercept msg使用InterceptManager crash msg使用内部的crash和crashQueue intercept_manager.cpp中 intercept_accept_cb/?intercept_request_cb /?intercept_close_cb tombstoned.cpp中?crash_accept_cb/crash_request_cb/?crash_completed_cb/perform_request intercept_request_cb 处理与debuggerd_client的通信,接收request,发送register和started crash_request_cb/perform_request 处理与crash_dump的通信,接收kDumpRequest/发送kPerformDump perform_request 里面会check intercept_manager 中是否有匹配项,并将获取其outputfd。 当crash_dump将所有需要的堆栈信息获取到后,通知tombstone?kCompletedDump tombstone中由crash_completed_cb 接收complete消息,并打印写到什么文件中。 【注意outputfd】 如果是system server获取的anr信息,则outputfd是anr文件,是由debuggerd_client 通过socket传递给intercept_manager 中,保存在数组中。 在接收到dumpRequest命令后,tombstone会check intercept数组,获取到对应的outputfd,传递给crash_dump 进程中,所有的dump实现中都是直接写到这个outputfd中了。 如果是target _pid 自己出现的crash等信息,这个outputfd 就是在tombstoned中自己创建的, perform_request > null = GetIntercept >?CrashQueue::for_crash(crash.get())->get_output(crash->crash_type) >??create_temporary_file? crash_completed_cb >?crash_completed >?rename_tombstone_fd >?/data/tombstones/tombstone_00? |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 0:42:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |