tombstone与debuggerd相关流程 | weiinter105

tombstone的抓取与debuggerd的有关系是一个守护进程,用来检测程序的崩溃,将程序崩溃前进程的状态记录下来,保存在/data/tombstone文件夹下,最多10个;本质上是对程序崩溃时某些信号的拦截

相关流程

客户端流程

首先,Android程序的入口有一个linker的操作,大致流程如下:

 

 

 

为上面这几个信号注册信号处理函数,也就是说只有这几个信号会生成tombstone

SIGILL(非法指令异常)

SIGABRT(abort退出异常)

SIGBUS(硬件访问异常)

SIGFPE(浮点运算异常)

SIGSEGV(内存访问异常)

SIGSTKFLT(协处理器栈异常)

SIGTRAP(这是什么?好像不常见)

信号处理函数为:

 

客户端向denggerd发送信息,并等待回应,通过socket的write & read

 

debuggerd服务端启动,dump流程

debuggerd守护进程如何启动,可以通过debuggerd -b 启动,我们暂且不去说他,就说正常的启动模式

 

启动一个debuggerd服务端

 

处理客户端发来的请求

 

read客户端发来的信息

 

整体的dump流程

 

perform_dump:进行dump的过程

 

本质上有两次通信;
第一次通信是进程的signal handler通过socket与启动的dubuggerd服务端进行通信,客户端向debuggerd写request,服务端获取request并返回一个值表示收到;同时attach到客户端,作为父进程;同时发送一个SIGSTOP信号,被接收时,此时通过debuggerd用PTRACE_CONT命令让应用继续执行,这样应用的read系统调用就可以返回到用户态,继续执行debuggerd_signal_handler,debuggerd进入下一次循环,block在wait_for_signal,继续等待应用的下一个信号

客户端收到答复之后,将注册的信号处理函数去掉,(这样再接收到信号就可以正常的走kernel流程了),然后再次发送一个信号

这里就是第二次通信,信号被父进程debuggerd拦截,开始dump操作,dump操作完后进行detach操作,不再作为客户端的父进程

此时客户端会进入到默认的信号处理逻辑中

 

 

 

可见coredump相应的信号比tombstone多,tombstone响应的为coredump的子集,能响应coredump的信号如下,参考default action列表:

 

那么如何tombstone添加一个信号呢?

作者: RESSRC

个人资源站

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据