Android 抓取Tombstone,crash,anr流程

转自:https://blog.csdn.net/guoqifa29/article/details/46833561

关键字:ActivityManagerService   addErrorToDropBox()  DropBoxManager

 

DropBoxManager会在以下时机抓取相关信息:

 

a、出异常关机前

SystemServer会收集以下类型报错:watchdog、anr、wtf、lowmem、native_crash、crash

TAG = watchdog、anr、wtf、lowmem、native_crash、crash

 

此时是通过ActivityManagerService.addErrorToDropBox()接口来收集信息并添加到DropBox中,可在addErrorToDropBox()中做拦截以抓取更多的日志:

 
 
12883    public void addErrorToDropBox(String eventType,
12884            ProcessRecord process, String processName, ActivityRecord activity,
12885            ActivityRecord parent, String subject,
12886            final String report, final File logFile,
12887            final ApplicationErrorReport.CrashInfo crashInfo) {
12888        // NOTE -- this must never acquire the ActivityManagerService lock,
12889        // otherwise the watchdog may be prevented from resetting the system.
12890

 

b、原生对/data/tombstones目录注册了一个观察者

TAG = SYSTEM_TOMBSTONE

 

如果系统抛一个tombstone未导致关机,那么就会将此次报错add到DropBox中,这是通过DropBoxManager.addText()接口添加信息到DropBox中的。

        sTombstoneObserver = new FileObserver(TOMBSTONE_DIR.getPath(), FileObserver.CLOSE_WRITE) {
            @Override
            public void onEvent(int event, String path) {
                try {
                    File file = new File(TOMBSTONE_DIR, path);
                    if (file.isFile()) {
                        addFileToDropBox(db, prefs, headers, file.getPath(), LOG_SIZE, "SYSTEM_TOMBSTONE");
                    }
                } catch (IOException e) {
                    Slog.e(TAG, "Can't log tombstone", e);
                }
            }
        };

这个逻辑在frameworks/base/core/java/com/android/server/BootReceiver.java文件中。

 

c、frameworks/base/core/java/com/android/server/BootReceiver.java中存在开机后抓取异常信息的逻辑

整机重启后(Kernel和Flyme):TAG = SYSTEM_BOOT

Flyme重启:                           TAG = SYSTEM_RESTART

从Recovery启动:                  TAG = SYSTEM_RECOVERY_LOG

开机扫描/data/tombstones目录:TAG = SYSTEM_TOMBSTONE

开机后原生逻辑已经抓取了一些信息,但不够多和细。

建议:

在SYSTEM_BOOT时,不用抓什么日志,因为整机重启,所有信息被冲掉;

在SYSTEM_RESTART时,可尝试抓取Android和kernel日志,这时可能会抓取到有用信息,但是由于开机已经有一段时间了,异常日志可能已被冲掉;

在SYSTEM_RECOVERY_LOG时,这个按原生的来就行;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值