Android 信号处理面面观之trace 文件含义

当Android应用收到SIGQUIT信号时,Davik虚拟机会生成trace文件,用于异常终止时记录上下文信息。信号处理主要在dvmSignalCatcherStartup()中进行,由信号处理线程负责。trace文件包含了进程ID、时间戳、线程信息和调用堆栈,用于调试和分析。
摘要由CSDN通过智能技术生成

Android 信号处理面面观之trace 文件含义
http://blog.csdn.net/rambo2188/article/details/7017241
一. TRACE 文件的产生
Trace文件是 android davik 虚拟机在收到异常终止信号 (SIGQUIT)时产生的。 最经常的触发条件是 android应用中产生了 FC (force close)。由于是该文件的产生是在 DVM里,所以只有运行 dvm实例的进程(如普通的java应用,java服务等)才会产生该文件,android 本地应用 (native app,指 运行在 android lib层,用c/c++编写的linux应用、库、服务等)在收到 SIGQUIT时是不会产生 trace文件的。
如上文Android 信号处理面面观 之 信号定义、行为和来源所述,我们可以在终端通过adb发送SIGQUIT给应用来生成trace文件。

二. TRACE文件的实现
相关实现在以下几个文件中:
dalvik/vm/init.h [.c]
davik/vm/SignalCatcher.h[.c]
dalvik/vm/Thread.h[.c]
Android ICS 实现文件后缀是 .cpp。

实现过程分以下几步:
Step #1:  DVM初始化时,设置信号屏蔽字,屏蔽要特殊处理的信号(SIGQUIT, SIGUSR1, SIGUSR2)。由于信号处理方式是进程范围起作用的, 这意味着该进程里所有的线程都将屏蔽该信号。 实现代码在init.c中如下:
[plain] view plaincopyprint?
int dvmStartup(int argc, const char* const argv[], bool ignoreUnrecognized,  
    JNIEnv* pEnv)  
{  
    ...  
    /* configure signal handling */  
    if (!gDvm.reduceSignals)  
        blockSignals();  
    ...  
}  

blockSignals()的实现很简答,它是通过 sigprocmask() 函数调用实现的,代码在init.c如下:
[plain] view plaincopyprint?
/*  
 * Configure signals.  We need to block SIGQUIT so that the signal only  
 * reaches the dump-stack-trace thread.  
 *  
 * This can be disabled with the "-Xrs" flag.  
 */  
static void blockSignals()  
{  
    sigset_t mask;  
    int cc;  
  
    sigemptyset(&mask);  
    sigaddset(&mask, SIGQUIT);  
    sigaddset(&mask, SIGUSR1);      // used to initiate heap dump  
#if defined(WITH_JIT) && defined(WITH_JIT_TUNING)  
    sigaddset(&mask, SIGUSR2);      // used to investigate JIT internals  
#endif  
    //sigaddset(&mask, SIGPIPE);  
    cc = sigprocmask(SIG_BLOCK, &mask, NULL);  
    assert(cc == 0);  
}  

Step #2: DVM 生成单独的信号处理线程,用来对三个信号做特殊处理 (init.c):
[plain] view plaincopyprint?
/*  
 * Do non-zygote-mode initialization.  This is done during VM init for  
 * standard startup, or after a "zygote fork" when creating a new process.  
 */  
bool dvmInitAfterZygote(void)  
{  
    ...  
    /* start signal catcher thread that dumps stacks on SIGQUIT */  
   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值