监听 Android ANR 信号并获取所有方法栈信息
💡
原文中文,约15400字,阅读约需37分钟。
📝
内容提要
本文介绍了如何监听Android ANR信号并获取方法栈信息。首先,通过监听SIGQUIT信号来替换原始信号处理函数,并获取原始信号处理函数的地址。然后,判断收到的信号是否为ANR信号,并向Signal Catcher线程发送信号。接下来,介绍了如何获取Signal Catcher线程的tid,并通过hook write()方法来获取ANR dump文件。最后,通过发送SIGQUIT信号给Signal Catcher线程,主动获取所有线程的方法栈信息。
🎯
关键要点
- 本文介绍如何监听Android ANR信号并获取方法栈信息。
- AMS向使用进程发送ANR信号后,Signal Catcher线程捕获并将线程栈信息dump到/data/anr目录。
- Android没有提供专门的接口来监听ANR的回调,用户无法直接获取ANR的dump文件。
- ANR信号是SIGQUIT,需先解除其默认处理,才能替换信号处理函数。
- 通过sigaction注册自定义的信号处理函数anrSignalHandler,处理ANR信号。
- 需要判断发送信号的进程不是当前进程,才能进行ANR处理。
- 获取Signal Catcher线程的tid可以通过读取/proc/[pid]/task目录下的线程信息。
- 通过hook Signal Catcher线程的write()方法,可以获取ANR dump文件。
- 不同Android版本需要hook不同的so库,使用xHook来完成hook操作。
- 可以主动发送SIGQUIT信号给Signal Catcher线程,获取所有线程的栈信息。
- ANR dump文件包含Java线程和Native线程的栈信息、状态、锁信息等,有助于问题分析。
🏷️
标签
➡️