我们知道,信号处理的行为是以进程级的。就是说不同的进程可以分别设置不同的信号处理方式而互不干扰。同一进程中的不同线程虽然可以设置不同的信号屏蔽字,但是却共享相同的信号处理方式 (也就是说 在一个线程里改变信号处理方式,将作用于该进程中的所有线程)。
Android也是Linux系统。所以其信号处理方式不会有本质的改变。但是为了开发和调试的需要,android对一些信号的处理定义了额外的行为。 下面是这些典型的信号在Android系统上的行为:
1. SIGQUIT ( 整型值为 3)
上面的表10-1显示,传统UNIX系统应用,对SIGQUIT信号的默认行为是 "终止 + CORE"。也就是产生core dump文件后,立即终于运行。
Android Dalvik应用收到该信号后,会 打印改应用中所有线程的当前状态,并且并不是强制退出。这些状态通常保存在一个特定的叫做trace的文件中。一般的路径是/data/anr/trace.txt. 下面是一个典型的trace文件的内容:
----- pid 503 at 2011-11-21 21:59:12 ----- Cmd line: com.android.phone DALVIK THREADS: (mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0) "main" prio=5 tid=1 NATIVE | group="main" sCount=1 dsCount=0 obj=0x400246a0 self=0x12770 | sysTid=503 nice=0 sched=0/0 cgrp=default handle=-1342909272 | schedstat=( 15165039025 12197235258 23068 ) utm=182 stm=1334 core=0 at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:119) at android.os.Looper.loop(Looper.java:122) at android.app.ActivityThread.main(ActivityThread.java:4134) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:491) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) at dalvik.system.NativeStart.main(Native Method) "Thread-29" prio=5 tid=24 WAIT | group="main" sCount=1 dsCount=0 obj=0x406f0d50 self=0x208c18 | sysTid=1095 nice=0 sched=0/0 cgrp=default handle=2133304 | schedstat=( 9521483 7029937750 720 ) utm=0 stm=0 core=0 at java.lang.Object.wait(Native Method) - waiting on <0x406f0d50> (a com.motorola.android.telephony.cdma.OemCdmaTelephonyManager$Watchdog) at java.lang.Object.wait(Object.java:361) at com.motorola.android.telephony.cdma.OemCdmaTelephonyManager$Watchdog.run(OemCdmaTelephonyManager.java:229) "FileObserver" prio=5 tid=23 NATIVE | group="main" sCount=1 dsCount=0 obj=0x4068b2f8 self=0x1ed278 | sysTid=909 nice=0 sched=0/0 cgrp=default handle=2019248 | schedstat=( 11810291 7018493670 720 ) utm=0 stm=0 core=0 at android.os.FileObserver$ObserverThread.observe(Native Method) at android.os.FileObserver$ObserverThread.run(FileObserver.java:88) "android.hardware.SensorManager$SensorThread" prio=5 tid=22 NATIVE | group="main" sCount=1 dsCount=0 obj=0x406bbd90 self=0x1b2ec0 | sysTid=869 nice=-8 sched=0/0 cgrp=default handle=1974064 | schedstat=( 3014251483 8295989933 15621 ) utm=171 stm=128 core=0 at android.hardware.SensorManager.sensors_data_poll(Native Method) at android.hardware.SensorManager$SensorThread$SensorThreadRunnable.run(SensorManager.java:498) at java.lang.Thread.run(Thread.java:1020) ...
该文件包好很多重要的信息,可以说明在发生异常是,当前进程的状态 (后面有单独的一篇文章分析改文件)