Android 信号处理面面观 之 信号定义、行为和来源(2)

我们知道,信号处理的行为是以进程级的。就是说不同的进程可以分别设置不同的信号处理方式而互不干扰。同一进程中的不同线程虽然可以设置不同的信号屏蔽字,但是却共享相同的信号处理方式 (也就是说 在一个线程里改变信号处理方式,将作用于该进程中的所有线程)。


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)   ...  

该文件包好很多重要的信息,可以说明在发生异常是,当前进程的状态 (后面有单独的一篇文章分析改文件)


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wysywf.html