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解析出来的)

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

171620_49Ks_3168816.png

2.6 dump_process_footer

[-> debuggerd/backtrace.cpp]

static void dump_process_footer(log_t* log, pid_t pid) {

  _LOG(log, logtype::BACKTRACE, "\n----- end %d -----\n", pid);

}

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

三. 总结

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

小米开放平台官方地址:

http://dev.xiaomi.com?hmsr=%E5%BC%80%E6%BA%90%E4%B8%AD%E5%9B%BD%E5%8D%9A%E5%AE%A2%E9%A2%91%E9%81%93&hmpl=&hmcu=&hmkw=&hmci=

小米开放平台官方交流群:398616987

想了解更多?

那就赶紧来关注我们

小米开放平台公众号

163330_9S5m_3168816.png

转载于:https://my.oschina.net/u/3168816/blog/841000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值