android中的Signal.docx
- 文档编号:25660348
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:18
- 大小:24.44KB
android中的Signal.docx
《android中的Signal.docx》由会员分享,可在线阅读,更多相关《android中的Signal.docx(18页珍藏版)》请在冰豆网上搜索。
android中的Signal
Android中的Signal信号
Contents
Signal信号1
[1]signal中文描述列表2
[2]Android信号处理5
[3]Whatissi_codes8
Example:
SEGV_ACCERR12
Example:
BUS_ADRALN12
Example:
SIGPIPE14
[4]signalandTraces/tombstone14
[5]Example:
Addsomelogstodebugsignal:
16
1Whokillsystem_server16
2seekernelwhyunkownreasonexit16
[6]Reference16
Whatissignal
Howmanykindsignal,Generalsignal
Howtosendsignal
Howtohandlesignal
Howtogenerallyusesignal
Signalandsystemcall
signalhandleReentrantFunctions
signalset
signalqueue
sigprocmaskFunction
Signalsarealimitedformofinter-processcommunicationusedinUnix,Unix-like,andotherPOSIX-compliantoperatingsystems.Asignalisanasynchronousnotificationsenttoaprocessortoaspecificthreadwithinthesameprocessinordertonotifyitofaneventthatoccurred.Signalsoriginatedin1970sBellLabsUnixandhavebeenmorerecentlyspecifiedinthePOSIXstandard.
Whenasignalissent,theoperatingsysteminterruptsthetargetprocess'normalflowofexecutiontodeliverthesignal.Executioncanbeinterruptedduringanynon-atomicinstruction.Iftheprocesshaspreviouslyregisteredasignalhandler,thatroutineisexecuted.Otherwise,thedefaultsignalhandlerisexecuted.
Embeddedprogramsmayfindsignalsusefulforinterprocesscommunications,asthecomputationalandmemoryfootprintforsignalsissmall.
[1]signal中文描述列表
SignalDescription
SIGABRT由调用abort函数产生,进程非正常退出
SIGALRM用alarm函数设置的timer超时或setitimer函数设置的intervaltimer超时
SIGBUS某种特定的硬件异常,通常由内存访问引起
SIGCANCEL由SolarisThreadLibrary内部使用,通常不会使用
SIGCHLD进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。
缺省情况下该Signal会被忽略
SIGCONT当被stop的进程恢复运行的时候,自动发送
SIGEMT和实现相关的硬件异常
SIGFPE数学相关的异常,如被0除,浮点溢出,等等
SIGFREEZESolaris专用,Hiberate或者Suspended时候发送
SIGHUP发送给具有Terminal的ControllingProcess,当terminal被disconnect时候发送
SIGILL非法指令异常
SIGINFOBSDsignal。
由StatusKey产生,通常是CTRL+T。
发送给所有ForegroundGroup的进程
SIGINT由InterruptKey产生,通常是CTRL+C或者DELETE。
发送给所有ForeGroundGroup的进程
SIGIO异步IO事件
SIGIOT实现相关的硬件异常,一般对应SIGABRT
SIGKILL无法处理和忽略。
中止某个进程
SIGLWP由SolarisThreadLibray内部使用
SIGPIPE在reader中止之后写Pipe的时候发送
SIGPOLL当某个事件发送给PollableDevice的时候发送
SIGPROFSetitimer指定的ProfilingIntervalTimer所产生
SIGPWR和系统相关。
和UPS相关。
SIGQUIT输入QuitKey的时候(CTRL+\)发送给所有ForegroundGroup的进程
SIGSEGV非法内存访问
SIGSTKFLTLinux专用,数学协处理器的栈异常
SIGSTOP中止进程。
无法处理和忽略。
SIGSYS非法系统调用
SIGTERM请求中止进程,kill命令缺省发送
SIGTHAWSolaris专用,从Suspend恢复时候发送
SIGTRAP实现相关的硬件异常。
一般是调试异常
SIGTSTPSuspendKey,一般是Ctrl+Z。
发送给所有ForegroundGroup的进程
SIGTTIN当BackgroundGroup的进程尝试读取Terminal的时候发送
SIGTTOU当BackgroundGroup的进程尝试写Terminal的时候发送
SIGURG当out-of-banddata接收的时候可能发送
SIGUSR1用户自定义signal1
SIGUSR2用户自定义signal2
SIGVTALRMsetitimer函数设置的VirtualIntervalTimer超时的时候
SIGWAITINGSolarisThreadLibrary内部实现专用
SIGWINCH当Terminal的窗口大小改变的时候,发送给ForegroundGroup的所有进程
SIGXCPU当CPU时间限制超时的时候
SIGXFSZ进程超过文件大小限制
SIGXRESSolaris专用,进程超过资源限制的时候发送
C:
\Users\shijunz>adbshellkill-l
1HUPHangup3333Signal33
2INTInterrupt3434Signal34
3QUITQuit3535Signal35
4ILLIllegalinstruction3636Signal36
5TRAPTrap3737Signal37
6ABRTAborted3838Signal38
7BUSBuserror3939Signal39
8FPEFloatingpointexception4040Signal40
9KILLKilled4141Signal41
10USR1Usersignal14242Signal42
11SEGVSegmentationfault4343Signal43
12USR2Usersignal24444Signal44
13PIPEBrokenpipe4545Signal45
14ALRMAlarmclock4646Signal46
15TERMTerminated4747Signal47
16STKFLTStackfault4848Signal48
17CHLDChildexited4949Signal49
18CONTContinue5050Signal50
19STOPStopped(signal)5151Signal51
20TSTPStopped5252Signal52
21TTINStopped(ttyinput)5353Signal53
22TTOUStopped(ttyoutput)5454Signal54
23URGUrgentI/Ocondition5555Signal55
24XCPUCPUtimelimitexceeded5656Signal56
25XFSZFilesizelimitexceeded5757Signal57
26VTALRMVirtualtimerexpired5858Signal58
27PROFProfilingtimerexpired5959Signal59
28WINCHWindowsizechanged6060Signal60
29IOI/Opossible6161Signal61
30PWRPowerfailure6262Signal62
31SYSBadsystemcall6363Signal63
3232Signal326464Signal64
[2]Android信号处理
我们知道,信号处理的方式一般有三种:
1.忽略接收到信号后不做任何反应。
2.自定义用自定义的信号处理函数来执行特定的动作
3.默认接收到信号后按默认得行为处理该信号。
这是多数应用采取的处理方式。
Signalhandlerscanbeinstalledwiththesignal()systemcall.Ifasignalhandlerisnotinstalledforaparticularsignal,thedefaulthandlerisused.Otherwisethesignalisinterceptedandthesignalhandlerisinvoked.Theprocesscanalsospecifytwodefaultbehaviors,withoutcreatingahandler:
ignorethesignal(SIG_IGN)andusethedefaultsignalhandler(SIG_DFL).Therearetwosignalswhichcannotbeinterceptedandhandled:
SIGKILLandSIGSTOP.
Android系统信号处理的行为
我们知道,信号处理的行为是以进程级的。
就是说不同的进程可以分别设置不同的信号处理方式而互不干扰。
同一进程中的不同线程虽然可以设置不同的信号屏蔽字,但是却共享相同的信号处理方式(也就是说在一个线程里改变信号处理方式,将作用于该进程中的所有线程)。
Android也是Linux系统。
所以其信号处理方式不会有本质的改变。
但是为了开发和调试的需要,android对一些信号的处理定义了额外的行为。
下面是这些典型的信号在Android系统上的行为:
1.SIGQUIT(整型值为3)
传统UNIX系统应用,对SIGQUIT信号的默认行为是"终止+CORE"。
也就是产生coredump文件后,立即终于运行。
AndroidDalvik应用收到该信号后,会打印改应用中所有线程的当前状态,并且并不是强制退出。
这些状态通常保存在一个特定的叫做trace的文件中。
一般的路径是/data/anr/trace.txt.
2.对于很多其他的异常信号(SIGILL,SIGABRT,SIGBUS,SIGFPE,SIGSEGV,SIGSTKFLT),Android进程在退出前,会生成tombstone文件。
记录该进程退出前的轨迹。
Android信号的产生和测试
我们看到,多数signal的产生是由于某种内部错误。
我们在在开发过程中,当然也可以通过系统调用故意生成signal给某进程。
主要的方法如果:
1.在kernel里使用kill_proc_info()
2.在native应用中使用kill()或者raise()
3.java应用中使用Procees.sendSignal()等
但是在测试中,最简单的方法某过于通过adb工具了。
一个典型场景是:
adbroot
adbshellps
adbshellkill-3513
首先是切换到root用户(普通进程只能发个自己或者同组进程,而root可以发送signal给任何进程)。
然后用ps命令查看当前系统中所有的进程信息。
最后用kill命令发送SIGQUIT给进程号为513的进程。
androidkill程序的实现很简单,他只能支持发送signal的值(如上例中的“3”)给进程,而不能用名字(如“SIGQUIT”)。
android中kill程序的代码在system/core/toolbox/kill.c中。
虽然移植linux中kill的实现就能支持名字,但是那个完全没有必要,android需要的signal就这么几个,他们的值应该记住的。
对于终端发送SIGQUIT,大多数用户可以直接得到预期的结果(生成相应的trace文件)。
最困惑的行为来自于终端发送SIGILL,SIGABRT,SIGBUS,SIGFPE,SIGSEGV,SIGSTKFLT等信号,我们常常看到“不确定”的行为:
有时候能够看到process终止,有时候却不能。
coredump也不是总能产生。
例如如下测试场景:
adbroot
adbshellps
adbshellkill-11299
从log里看到进程299并没有终止,ps看到进程还在。
Log只有如下输出:
F/libc(244):
Fatalsignal11(SIGSEGV)at0x000001c0(code=0)
I/DEBUG(31):
timedoutwaitingforpid=244tid=244uid=10009todie
再试一次:
adbshellps
adbshellkill-11299
这次进程299被终止掉了,却没有产生coredump文件:
D/Zygote(34):
Process244terminatedbysignal(11)
I/ActivityManager(78):
Processcom.android.calendar(pid244)hasdied.
其实,我们观察到得不确定行为是因为没有了解android这些信号的处理。
他的行为的确是确定的,要点是:
要产生coredump并终止某进程,我们需要连续发送两次改信号,并且中间间隔在0.2秒到3秒之间。
如果间隔过小,Android可能无法接收第一个signal。
如果时间过久,android将简单的终止进程,而没有coredump产生。
我们会在后面详细的介绍产生这种行为的原因。
好了,了解到上面的行为后,我们再次试验,连续两次发送SIGSEGV给进程,看看行为:
adbshellps
adbshellkill-11307
adbshellkill-11307
我们看到,该进程被终止,tombstone被打到log里,并且存储在/data/tombstone_00中:
也可能在其他的在/data/tombstone_XX中
SignalCatcher
这个线程是用来捕获linux信号和做一些后续处理的。
比如说,当一个SIGQUIT(Ctrl-\)信号到达后,这个线程就会挂起虚拟机,并且将所有线程的状态信息输出到log。
其源代码在dalvik/vm/SignalCatcher.*部分。
[3]Whatissi_codes
Documentationofasort(indexedLinuxsourcecode)forSEGV_MAPERRishere:
http:
//lxr.free-
166/*
167*si_codevalues
168*Digitalreservespositivevaluesforkernel-generatedsignals.
169*/
170#defineSI_USER0/*sentbykill,sigsend,raise*/
171#defineSI_KERNEL0x80/*sentbythekernelfromsomewhere*/
172#defineSI_QUEUE-1/*sentbysigqueue*/
173#defineSI_TIMER__SI_CODE(__SI_TIMER,-2)/*sentbytimerexpiration*/
174#defineSI_MESGQ__SI_CODE(__SI_MESGQ,-3)/*sentbyrealtimemesqstatechange*/
175#defineSI_ASYNCIO-4/*sentbyAIOcompletion*/
176#defineSI_SIGIO-5/*sentbyqueuedSIGIO*/
177#defineSI_TKILL-6/*sentbytkillsystemcall*/
178#defineSI_DETHREAD-7/*sentbyexecve()killingsubsidiarythreads*/
179
180#defineSI_FROMUSER(siptr)((siptr)->si_code<=0)
181#defineSI_FROMKERNEL(siptr)((siptr)->si_code>0)
182
183/*
184*SIGILLsi_codes
185*/
186#defineILL_ILLOPC(__SI_FAULT|1)/*illegalopcode*/
187#defineILL_ILLOPN(__SI_FAULT|2)/*illegaloperand*/
188#defineILL_ILLADR(__SI_FAULT|3)/*illegaladdressingmode*/
189#defineILL_ILLTRP(__SI_FAULT|4)/*illegaltrap*/
190#defineILL_PRVOPC(__SI_FAULT|5)/*privilegedopcode*/
191#defineILL_PRVREG(__SI_FAULT|6)/*privilegedregister*/
192#defineILL_COPROC(__SI_FAULT|7)/*coprocessorerror*/
193#defineILL_BADSTK(__SI_FAULT|8)/*internalstackerror*/
194#defineNSIGILL8
195
196/*
197*SIGFPEsi_codes
198*/
199#defineFPE_INTDIV(__SI_FAULT|1)/*integerdividebyzero*/
200#defineFPE_INTOVF(__SI_FAULT|2)/*integeroverflow*/
201#defineFPE_FLTDIV(__SI_FAULT|3)/*floatingpointdividebyzero*/
202#defineFPE_FLTOVF(__SI_FAULT|4)/*floatingpointoverflow*/
203#defineFPE_FLTUND(__SI_FAULT|5)/*floatingpointunderflow*/
204#defineFPE_FLTRES(__SI_FAULT|6)/*floatingpointinexactresult*/
205#defineFPE_FLTINV(__SI_FAULT|7)/*floatingpointinvalidoperation*/
206#defineFPE_FLTSUB(__SI_FAULT|8)/*subscriptoutofrange*/
207#defineNSIGFPE8
208
209/*
210*SIGSEGVsi_codes
211*/
212#defineSEGV_MAPERR(__SI_FAULT|1)/*addressnotmappedtoobject*/
213#defineSEGV_ACCERR(__SI_FAULT|2)/*invalidpermissionsformappedobject*/
214#defineSEGV_BNDERR(__SI_FAULT|3)/*failedaddressboundchecks*/
215#defineSEGV_PKUERR(__SI_FAULT|4)/*failedprotectionkeychecks*/
216#defineNSIGSEGV4
217
218/*
219*SIGBUSsi_codes
220*/
221#defineBUS_ADRALN(__SI_FAULT|1)/*invalidaddressalignment*/
222#defineBUS_ADRERR(__SI_FAULT|2)/*non-existentphysicaladdress*/
223#defineBUS_OBJERR(__SI_FAULT|3)/*objectspecifichardwareerror*/
224/*hardwarememorye
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 中的 Signal