Native进程之Trace原理

开发 开发工具
今天讲一讲Native进程之Trace原理的内容。

一. 概述

当发生ANR(Application Not Response),对于Java进程可通过kill -3向目标进程发送信号SIGNAL_QUIT, 输出相应的traces信息保存到目录/data/anr/traces.txt;而对于Native进程可通过 debuggerd输出traces信息。

进程

可通过一条命令来获取指定Native进程的traces信息,例如输出pid=17529进程信息:

通过一条命令来获取指定Native进程的traces信息

执行完该命令后直接输出traces信息到屏幕,如下:

通过一条命令来获取指定Native进程的traces信息

接下来说说debuggerd是如何输出Native进程的trace。

二. Debuggerd

文章debuggerd守护进程详细介绍了Debuggerd的工作原理,此处当执行debuggerd -b命令后:

  1. Client进程调用send_request()方法向debuggerd服务端发出DEBUGGER_ACTION_DUMP_BACKTRACE命令;
  2. Debugggerd进程收到该命令,fork子进程中再执行worker_process()过程;
  3. 子进程通过perform_dump()方法来根据命令DEBUGGER_ACTION_DUMP_BACKTRACE,会调用到dump_backtrace()方法输出backtrace.

接下来,从dump_backtrace()方法讲起:

2.1 dump_backtrace

[-> debuggerd/backtrace.cpp]

 dump_backtrace [-> debuggerd/backtrace.cpp]

2.2 dump_process_header

[-> debuggerd/backtrace.cpp]

dump_process_header  [-> debuggerd/backtrace.cpp]

例如:

dump_process_header  [-> debuggerd/backtrace.cpp]

2.3 dump_thread

[-> debuggerd/backtrace.cpp]

dump_thread  [-> debuggerd/backtrace.cpp]

2.4 dump_backtrace_to_log

[-> debuggerd/Backtrace.cpp]

 dump_backtrace_to_log  [-> debuggerd/Backtrace.cpp]

通过循环遍历输出整个backtrace中的每一栈帧FormatFrameData的信息.

2.5 FormatFrameData

[-> debuggerd/Backtrace.cpp]

 FormatFrameData  [-> debuggerd/Backtrace.cpp]

例如:(这些map信息是由/proc/%d/maps解析出来的)

  1. #01 pc 000000000001cca4 /system/lib64/libc.so (epoll_pwait+32) 

2.6 dump_process_footer

[-> debuggerd/backtrace.cpp]

  1. static void dump_process_footer(log_t* log, pid_t pid) { 
  2.   _LOG(log, logtype::BACKTRACE, "\n----- end %d -----\n", pid); 

例如:----- end 1789 -----

三. 总结

通过debuggerd -b [pid],可输出Native进程的调用栈,这些信息是通过解析/proc/[pid]/maps而来的。

【本文是51CTO专栏“小米开放平台”原创文章,“小米开放平台”微信公众号xiaomideveloper】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2011-08-08 10:02:55

iPhone开发 进程 通信

2020-04-29 15:10:16

Linux命令进程

2011-08-24 10:45:23

Oracle数据库进程从属进程

2011-08-24 10:31:10

Oracle数据库进程后台进程

2019-11-08 14:47:49

TCPIP网络

2010-10-09 16:48:04

2011-08-24 10:15:55

Oracle数据库服务器进程

2017-01-10 13:39:57

Python线程池进程池

2021-02-14 21:05:05

通信消息系统

2020-12-04 19:28:53

CountDownLaPhaserCyclicBarri

2020-12-03 11:15:21

CyclicBarri

2020-12-09 08:21:47

编程Exchanger工具

2020-12-16 10:54:52

编程ForkJoin框架

2020-11-30 16:01:03

Semaphore

2018-07-06 14:00:55

Linux进程线程

2021-07-15 12:44:25

Shell编程进程

2016-10-21 11:04:07

JavaScript异步编程原理解析

2020-12-08 08:53:53

编程ThreadPoolE线程池

2018-05-31 10:57:31

Linux系统进程线程

2023-05-10 07:53:08

.Net开发多进程通信方式
点赞
收藏

51CTO技术栈公众号