2025年进程控制块的含义(进程控制块的意义)

进程控制块的含义(进程控制块的意义)p p

大家好,我是讯享网,很高兴认识大家。



 <p><img class="lazyload" src="https://img1.sycdn.imooc.com//5b61c2cb.jpg" data-original="https://img1.sycdn.imooc.com//5b61c2cb.jpg" alt="https://img1.sycdn.imooc.com//5b61c2cb.jpg"></p><h6>&#27010;&#36848;&#65306;</h6><p>&#26412;&#25991;&#20027;&#35201;&#35762;&#35299;&#36827;&#31243;&#22522;&#30784;&#65292;&#26356;&#28145;&#20837;&#30340;&#35748;&#35782;&#26377;&#34880;&#26377;&#32905;&#30340;&#36827;&#31243;&#65292;&#20869;&#23481;&#28041;&#21450;&#36827;&#31243;&#25511;&#21046;&#22359;&#65292;&#20449;&#21495;&#65292;&#36827;&#31243;FD&#27844;&#38706;&#31561;&#31561;&#12290;&#20165;&#20379;&#21442;&#32771;&#65292;&#27426;&#36814;&#25351;&#27491;&#12290;</p><h4>&#19968;&#12289;&#20174;Linux&#30475;&#36827;&#31243;&#21040;&#24213;&#26159;&#20160;&#20040;&#65311;</h4><p>&ldquo;&#36827;&#31243;&#22235;&#35201;&#32032;&rdquo; &mdash;&#12298;Linux &#20869;&#26680;&#28304;&#20195;&#30721;&#24773;&#26223;&#20998;&#26512;&#12299;&#25551;&#36848;&#22914;&#19979;&#65306;</p><p>&#19978;&#38754;&#30830;&#23454;&#26377;&#28857;&#25277;&#35937;&#65292;&#36827;&#31243;&#19981;&#20165;&#20165;&#26159;&#19968;&#27573;&#22788;&#22312;&#25191;&#34892;&#29366;&#24577;&#30340;&#31243;&#24207;&#65292;&#36824;&#21253;&#25324;&#36824;&#25991;&#20214;&#65292;&#20449;&#21495;&#65292;&#20869;&#23384;&#22320;&#22336;&#31354;&#38388;&#65292;CPU&#29366;&#24577;&#31561;&#31561;&#22797;&#26434;&#30340;&#20449;&#24687;&#65292;&#26356;&#37325;&#35201;&#30340;&#26159;&#25317;&#26377;&#29420;&#31435;&#30340;&#29992;&#25143;&#23384;&#20648;&#31354;&#38388;&#65292;&#36825;&#20010;&#26159;&#19982;&#32447;&#31243;&#30340;&#26412;&#36136;&#21306;&#21035;&#12290;&#22312;Linux&#20869;&#26680;&#20013;&#65292;&#36827;&#31243;&#26159;&#30001;&#19968;&#20010;<br>&#19979;&#38754;&#30340;&#20195;&#30721;&#32473;&#20986;&#20102;task_struct&#30340;&#19968;&#23567;&#37096;&#20998;&#65292;&#24050;&#32463;&#22312;&#21518;&#38754;&#20889;&#28165;&#26970;&#20102;&#27880;&#37322;&#65292;&#36825;&#20010;&#32467;&#26500;&#20307;&#30456;&#23545;&#36739;&#22823;&#65292;&#22312;32&#20301;&#30340;&#26426;&#22120;&#19978;&#32422;1.7kb&#12290;</p><pre>struct&nbsp;task_struct&nbsp;{ 

讯享网

&nbsp;&nbsp;&nbsp;volatile&nbsp;long&nbsp;state;&nbsp;&nbsp;&nbsp;&nbsp;//进程的允许状态/&nbsp;-1&nbsp;unrunnable,&nbsp;0&nbsp;runnable,&nbsp;&gt;0&nbsp;stopped&nbsp;/&nbsp; &nbsp;&nbsp;&nbsp;void&nbsp;stack;&nbsp;&nbsp;&nbsp;atomic_t&nbsp;usage;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;flags;&nbsp;/&nbsp;per&nbsp;process&nbsp;flags,&nbsp;defined&nbsp;below&nbsp;*/ &nbsp;&nbsp;&nbsp;pid_t&nbsp;pid;&nbsp;&nbsp;&nbsp;//进程的pid &nbsp;&nbsp;&nbsp;pid_t&nbsp;tgid;//线程组的id &nbsp;&nbsp;&nbsp;struct&nbsp;task_struct&nbsp;real_parent;&nbsp;/&nbsp;real&nbsp;parent&nbsp;process&nbsp;(when&nbsp;being&nbsp;debugged)&nbsp;&nbsp;,如果创建它的父进程不再存在,则指向PID为1的init进程*/&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct&nbsp;task_struct&nbsp;parent;&nbsp;/&nbsp;parent&nbsp;process&nbsp;&ldquo;养父进程&rdquo;通常与real_parent值相同,当它终止时,必须向它的父进程发送信号/&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct&nbsp;list_head&nbsp;children;&nbsp;&nbsp;/&nbsp;list&nbsp;of&nbsp;my&nbsp;children&nbsp;/该进程的孩子进程链表&nbsp;&nbsp;&nbsp;struct&nbsp;list_head&nbsp;sibling;&nbsp;&nbsp;&nbsp;/&nbsp;linkage&nbsp;in&nbsp;my&nbsp;parent’s&nbsp;children&nbsp;list&nbsp;/&nbsp;该进程的兄弟进程链表&nbsp;&nbsp;&nbsp;struct&nbsp;list_head&nbsp;thread_group;&nbsp;//线程链表&nbsp; &nbsp;&nbsp;&nbsp;struct&nbsp;task_struct&nbsp;group_leader;&nbsp;&nbsp;&nbsp;/&nbsp;threadgroup&nbsp;leader&nbsp;*/该进程的线程组长&nbsp;&nbsp;&nbsp;struct&nbsp;timespec&nbsp;start_time;&nbsp;&nbsp;//进程创建时间&nbsp; &nbsp;&nbsp;&nbsp;struct&nbsp;fs_struct&nbsp;*fs;&nbsp;&nbsp;//文件系统信息&nbsp; &nbsp;&nbsp;&nbsp;struct&nbsp;files_struct&nbsp;*files;//打开的文件信息 &nbsp;&nbsp;&nbsp;struct&nbsp;mm_struct&nbsp;*mm,&nbsp;active_mm;//描述进程的地址空间,active_mm指向进程运行时所使用的内存描述符,&nbsp;对于普通进程而言,这两个指针变量的值相同,但是内核线程kernel&nbsp;thread是没有进程地址空间的 &nbsp;&nbsp;&nbsp;int&nbsp;prio,&nbsp;static_prio,&nbsp;normal_prio;//static_prio用于保存静态优先级,prio用于保存动态优先级 &nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;rt_priority;//用于保存实时优先级 &nbsp;&nbsp;&nbsp;/&nbsp;signal&nbsp;handlers&nbsp;*/ &nbsp;&nbsp;&nbsp;struct&nbsp;signal_struct&nbsp;*signal; &nbsp;&nbsp;&nbsp;struct&nbsp;sighand_struct&nbsp;sighand;}

state表示进程的状态定义如下,我们了解其中几种。

讯享网/ *&nbsp;Task&nbsp;state&nbsp;bitmask.&nbsp;NOTE!&nbsp;These&nbsp;bits&nbsp;are&nbsp;also *&nbsp;encoded&nbsp;in&nbsp;fs/proc/array.c:&nbsp;get_task_state(). * *&nbsp;We&nbsp;have&nbsp;two&nbsp;separate&nbsp;sets&nbsp;of&nbsp;flags:&nbsp;task-&gt;state *&nbsp;is&nbsp;about&nbsp;runnability,&nbsp;while&nbsp;task-&gt;exit_state&nbsp;are *&nbsp;about&nbsp;the&nbsp;task&nbsp;exiting.&nbsp;Confusing,&nbsp;but&nbsp;this&nbsp;way *&nbsp;modifying&nbsp;one&nbsp;set&nbsp;can’t&nbsp;modify&nbsp;the&nbsp;other&nbsp;one&nbsp;by *&nbsp;mistake. /#define&nbsp;TASK_RUNNING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0#define&nbsp;TASK_INTERRUPTIBLE&nbsp;&nbsp;1#define&nbsp;TASK_UNINTERRUPTIBLE&nbsp;&nbsp;&nbsp;&nbsp;2#define&nbsp;TASK_STOPPED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4#define&nbsp;TASK_TRACED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8/&nbsp;in&nbsp;tsk-&gt;exit_state&nbsp;/#define&nbsp;EXIT_DEAD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16#define&nbsp;EXIT_ZOMBIE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32#define&nbsp;EXIT_TRACE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(EXIT_ZOMBIE&nbsp;|&nbsp;EXIT_DEAD)/&nbsp;in&nbsp;tsk-&gt;state&nbsp;again&nbsp;*/#define&nbsp;TASK_DEAD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;64#define&nbsp;TASK_WAKEKILL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;128#define&nbsp;TASK_WAKING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;256#define&nbsp;TASK_PARKED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;512#define&nbsp;TASK_STATE_MAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1024
TASK_RUNNING0表示进程要么正在执行,要么正要准备执行(就绪状态),正在等待cpu时间片的调度TASK_INTERRUPTIBLE1进程因为等待一些条件而被挂起(阻塞)而所处的状态。这些条件主要包括:硬中断、资源、一些信号&hellip;&hellip;,一旦等待的条件成立,进程就会从该状态迅速转化成为TASK_RUNNING状态,是一种可中断的等待状态TASK_UNINTERRUPTIBLE2不可中断的等待状态TASK_STOPPED4进程被停止执行,当进程接收到SIGSTOP、SIGTTIN、SIGTSTP或者SIGTTOU信号之后就会进入该状态TASK_TRACED8表示进程被debugger等进程监视,进程执行被调试程序所停止,当一个进程被另外的进程所监视,每一个信号都会让进城进入该状态EXIT_ZOMBIE32进程被终止,但是其父进程还没有使用wait()等系统调用来获知它的终止信息,此时进程成为僵尸进程EXIT_DEAD16进程的最终状态

POSIX(Portable Operating System Interface for Computing System,,准确地说是针对类Unix操作系统的标准化协议)规定一个进程内部的多个thread要共享一个PID,在很多情况下,进程都是动态分配一个 task_struct 表示,其实线程也是由一个task_struct 来表示的,所以task_struct具有双重身份,既可以作为进程对象,也可以作线程对象。这样,为了满足POSIX的线程规定,linux引入了线程组的概念,一个进程中的所有线程所共享的那个PID被称为线程组ID,也就是task struct中的tgid成员,因此,在linux kernel中,线程组ID(tgid,thread group id)就是传统意义的进程ID。对于getpid系统调用,linux内核返回了tgid。对于gettid系统调用,本意是要求返回线程ID,在linux内核中,返回了task struct的pid成员。简单来一句总结:POSIX的进程ID就是linux中的线程组ID。POSIX的线程ID也就是linux中的pid。

a、进程的标志符,如pid,uid等

b、进程的状态,如state, exit_state, prio等
c、进程间的关系,如parent, children,sibling等
d、进程拥有的资源,如mm,fs,files,mm等
e、信号处理函数,如signal, sighand等

2、task_struct具有双重身份,线程和进程都是用task_struct表示,区别在于进程拥有独立的用户空间,而线程和其它线程是共享存储空间的。

二、进程进阶

2.1、 pid ,ppid ,tgid ,pgid ,sid 的理解

上面了解了进程的数据结构,我们可以通过下面两条命令来查看进程的信息,进一步加强进程相关标识的理解(pid ,ppid ,tgid ,pgid ,sid )

cat&nbsp;/proc/self/status&nbsp; cat&nbsp;/proc/self/stat

拿头条App举例

讯享网jason:/&nbsp;\(&nbsp;ps&nbsp;-ef&nbsp;|grep&nbsp;com.ss.android.article.news u0_a159&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10276&nbsp;&nbsp;1112&nbsp;87&nbsp;15:19:50&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;00:00:32&nbsp;com.ss.android.article.news u0_a159&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10731&nbsp;&nbsp;1112&nbsp;1&nbsp;15:19:56&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00&nbsp;com.ss.android.article.news:pushservice u0_a159&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10794&nbsp;&nbsp;1112&nbsp;9&nbsp;15:19:57&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:02&nbsp;com.ss.android.article.news:push u0_a159&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10953&nbsp;&nbsp;1112&nbsp;2&nbsp;15:19:58&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00&nbsp;com.ss.android.article.news:ad shell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11198&nbsp;11193&nbsp;6&nbsp;15:20:27&nbsp;pts/0&nbsp;00:00:00&nbsp;grep&nbsp;com.ss.android.article.news jason:/&nbsp;\)&nbsp;cat&nbsp;/proc/10276/stat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10276&nbsp;(id.article.news)&nbsp;S&nbsp;1112&nbsp;1111&nbsp;0&nbsp;0&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;137&nbsp;0&nbsp;3783&nbsp;3165&nbsp;1004&nbsp;406&nbsp;16&nbsp;-4&nbsp;144&nbsp;0&nbsp;31842&nbsp;&nbsp;53986&nbsp;&nbsp;1&nbsp;1&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;4612&nbsp;1&nbsp;&nbsp;0&nbsp;0&nbsp;0&nbsp;17&nbsp;2&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0

每个参数意思为:
pid=10276 进程(包括轻量级进程,即线程)号
comm=id.article.news 应用程序或命令的名字
task_state=S 任务的状态,R:running, S:sleeping, D:disk T: stopped, T:tracing stop,Z:zombie, X:dead
ppid=1112 父进程ID
pgid=1111 Process Group ID 进程组 ID号
sid=0 该任务所在的会话组ID
TODO:内存中进程是怎么组织的
…..

pgid是什么:每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (process group leader),领导进程的PID成为进程组的ID (process group ID, PGID),以识别进程组。

sid是什么:更进一步,在shell支持工作控制(job control)的前提下,多个进程组还可以构成一个会话 (session),sid标识会话id,Android中进程的sid基本都是0。

130|jason:/&nbsp;\(&nbsp;cat&nbsp;/proc/10276/status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name:&nbsp;&nbsp;&nbsp;id.article.news State:&nbsp;&nbsp;S&nbsp;(sleeping) Tgid:&nbsp;&nbsp;&nbsp;10276Pid:&nbsp;&nbsp;&nbsp;&nbsp;10276PPid:&nbsp;&nbsp;&nbsp;1112TracerPid:&nbsp;&nbsp;0Uid:&nbsp;&nbsp;&nbsp;&nbsp;10159&nbsp;&nbsp;&nbsp;10159&nbsp;&nbsp;&nbsp;10159&nbsp;&nbsp;&nbsp;10159Gid:&nbsp;&nbsp;&nbsp;&nbsp;10159&nbsp;&nbsp;&nbsp;10159&nbsp;&nbsp;&nbsp;10159&nbsp;&nbsp;&nbsp;10159Ngid:&nbsp;&nbsp;&nbsp;0FDSize:&nbsp;512Groups:&nbsp;3002&nbsp;3003&nbsp;9997&nbsp;20159&nbsp;50159&nbsp;VmPeak:&nbsp;&nbsp;&nbsp;kB VmSize:&nbsp;&nbsp;&nbsp;kB VmLck:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;kB VmPin:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;kB VmHWM:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kB VmRSS:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kB VmData:&nbsp;&nbsp;&nbsp;&nbsp;kB VmStk:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8192&nbsp;kB VmExe:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;kB VmLib:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kB VmPTE:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1584&nbsp;kB VmPMD:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;kB VmSwap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;kB Threads:&nbsp;&nbsp;&nbsp;&nbsp;142</pre><p>Tgid&#26159;&#20160;&#20040;:</p><p>&#36890;&#36807;&#19978;&#38754;&#20004;&#20010;&#21629;&#20196;&#21487;&#20197;&#30830;&#35748;&#20960;&#20010;&#24120;&#35265;&#36827;&#31243;&#30340;&#20851;&#31995;</p><div><tbody></tbody></div><p>&#25110;&#35768;&#29992;&#19979;&#38754;&#30340;&#22270;&#34920;&#31034;&#26356;&#30452;&#35266;</p><p><img class="lazyload" src="https://img1.sycdn.imooc.com//5b61c2ef00065.jpg" data-original="https://img1.sycdn.imooc.com//5b61c2ef00065.jpg" alt="Picture" title="Picture" style="word-wrap: break-word; box-sizing: content-box; border-style: none; max-width: 100%; background-color: rgb(255, 255, 255); display: inline-block; max-height: 500px;"></p><p>&#20174;&#34920;&#26684;&#20013;&#21015;&#20030;&#30340;&#20851;&#31995;&#65292;&#21487;&#30475;&#21040;&#19968;&#20010;Android&#30340;App&#36827;&#31243;&#36827;&#31243;&#30340;&#21019;&#24314;&#36807;&#31243;&#65292;&#26159;&#30001;idle&#36827;&#31243; -&gt; init&#36827;&#31243; -&gt; zygote&#36827;&#31243; -&gt; system_server&#36827;&#31243; -&gt; App&#36827;&#31243;&#12290;</p><p>&#38382;&#39064;&#65306;64&#20301;&#19979;&#26377;&#20004;&#20010;zygote&#65292;zygote64&#21644;zygote&#12290;64&#20301;&#24212;&#29992;&#30340;&#29238;&#36827;&#31243;&#26159;zygote64&#65292;&#23427;&#30340;pgid&#20063;&#26159;zygote64&#30340;pid&#65307;32&#20301;&#24212;&#29992;&#30340;&#29238;&#36827;&#31243;&#26159;zygote&#65292;&#23427;&#30340;pgid&#21364;&#26159;zygote64&#30340;pid&#65292;&#22914;&#65306;com.ss.android.article.news&#30340;&#29238;&#36827;&#31243;&#26159;zygote&#65288;1112&#65289;&#65292;&#20294;&#23427;&#30340;pgid&#26159;zygote64(1111)&#65292;&#36825;&#26159;&#24590;&#20040;&#22238;&#20107;&#21602;&#65311;&#21407;&#26469;&#19981;&#31649;32&#20301;&#25110;64&#20301;&#30340;zygote&#65292;&#23427;&#22312;&#21019;&#24314;&#23436;&#23376;&#36827;&#31243;&#21518;&#65292;&#20250;&#35843;&#29992;setChildPgid()&#26469;&#25913;&#21464;&#23376;&#36827;&#31243;&#30340;pgid&#12290;</p><pre>&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;setChildPgid(int&nbsp;pid)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Try&nbsp;to&nbsp;move&nbsp;the&nbsp;new&nbsp;child&nbsp;into&nbsp;the&nbsp;peer's&nbsp;process&nbsp;group. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Os.setpgid(pid,&nbsp;Os.getpgid(peer.getPid())); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(ErrnoException&nbsp;ex)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;exception&nbsp;is&nbsp;expected&nbsp;in&nbsp;the&nbsp;case&nbsp;where &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;the&nbsp;peer&nbsp;is&nbsp;not&nbsp;in&nbsp;our&nbsp;session &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;get&nbsp;rid&nbsp;of&nbsp;this&nbsp;log&nbsp;message&nbsp;in&nbsp;the&nbsp;case&nbsp;where &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;getsid(0)&nbsp;!=&nbsp;getsid(peer.getPid()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.i(TAG,&nbsp;"Zygote:&nbsp;setpgid&nbsp;failed.&nbsp;This&nbsp;is&nbsp;" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"normal&nbsp;if&nbsp;peer&nbsp;is&nbsp;not&nbsp;in&nbsp;our&nbsp;session"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;}</pre><p>peerpeer&#26159;socket&#30340;&#23545;&#31471;&#65292;&#20063;&#23601;&#26159;system_server&#12290;&#32780;system_server&#30340;pgid&#23601;&#26159;zygote64&#30340;pid&#12290;&#36825;&#26679;&#65292;&#25152;&#26377;zygote32&#21019;&#24314;&#20986;&#26469;&#30340;&#23376;&#36827;&#31243;&#65292;&#20182;&#20204;&#30340;pgid&#37117;&#26159;zygote64&#30340;pid&#20102;&#12290;</p><h5>2.2&#12289;&#36827;&#31243;&#20869;&#23384;&#20449;&#24687;&#30340;&#26597;&#30475;</h5><p>&#38500;&#20102;&#29992;&#19978;&#38754;&#30340;cat /proc/pid/status&#21487;&#20197;&#26597;&#30475;&#20869;&#23384;&#20043;&#22806;&#65292;&#20063;&#21487;&#20197;&#29992; top -p pid&#12290;&#27604;&#22914;&#20320;&#20889;&#20102;&#19968;&#20010;&#21344;&#29992;&#20869;&#23384;&#30340;&#31243;&#24207;&#65292;&#24819;&#30475;&#30475;&#21344;&#29992;&#30340;&#20869;&#23384;&#23545;&#19981;&#23545;&#65292;&#23601;&#21487;&#20197;&#20351;&#29992;top -p pid&#12290;</p><pre>top&nbsp;-p&nbsp;11364 PID&nbsp;USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PR&nbsp;&nbsp;NI&nbsp;VIRT&nbsp;&nbsp;RES&nbsp;&nbsp;SHR&nbsp;S[%CPU]&nbsp;%MEM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIME+&nbsp;ARGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11364&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;0&nbsp;1.7G&nbsp;&nbsp;44K&nbsp;&nbsp;24K&nbsp;S&nbsp;&nbsp;0.0&nbsp;&nbsp;&nbsp;0.0&nbsp;&nbsp;&nbsp;2:14.29&nbsp;ramServer&nbsp;40</pre><p>VIRT&#20026;1.7G&#65292;&#36825;&#20010;&#26159;&#34394;&#25311;&#20869;&#23384;&#65292;&#20030;&#20010;&#21015;&#23376;&#65292;malloc&#21482;&#26159;&#30003;&#35831;&#20102;&#34394;&#25311;&#31354;&#38388;&#65292;&#24182;&#27809;&#26377;&#21344;&#29992;&#29289;&#29702;&#20869;&#23384;&#12290;?&#21482;&#26377;&#20351;&#29992;&#26102;&#25165;&#20250;&#20998;&#37197;&#29289;&#29702;&#20869;&#23384;&#65292;&#22914;memset&#30003;&#35831;&#30340;&#37027;&#22359;&#21306;&#22495;&#26102;&#25165;&#20250;&#20998;&#37197;&#29289;&#29702;&#20869;&#23384;&#12290;&#23454;&#38469;&#21344;&#29992;&#30340;&#20869;&#23384;&#21487;&#20197;&#21442;&#32771;RES&#30340;&#22823;&#23567;&#12290;</p><h5>2.3&#12289;&#36827;&#31243;&#30340;fd&#27844;&#38706;&#38382;&#39064;</h5><p>&#36827;&#31243;&#30340;fd&#27844;&#38706;&#38382;&#39064;&#19968;&#30452;&#26159;&#19968;&#20010;&#24456;&#38590;&#25630;&#30340;&#38382;&#39064;&#65292;&#20808;&#30475;&#19968;&#27573;system_server_crash&#30340;trace&#21543;</p><pre>1970-10-11&nbsp;20:47:05&nbsp;SYSTEM_RESTART&nbsp;(text,&nbsp;342&nbsp;bytes) Build:&nbsp;Xiaomi/scorpio/scorpio:7.0/NRD90M/7.7.24:user/release-keys Hardware:&nbsp;QC_Reference_Phone Revision:&nbsp;0Bootloader:&nbsp;unknown Radio:&nbsp;TH20c1.9-0711_1858_6c2ad98 Kernel:&nbsp;Linux&nbsp;version&nbsp;3.18.31-perf-g0bf156d-00846-gadfe339&nbsp;()&nbsp;(gcc&nbsp;version&nbsp;4.9&nbsp;&nbsp;(prerelease)&nbsp;(GCC)&nbsp;)&nbsp;#1&nbsp;SMP&nbsp;PREEMPT&nbsp;Mon&nbsp;Jul&nbsp;24&nbsp;06:01:35&nbsp;CST&nbsp;-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;Can't&nbsp;write:&nbsp;system_server_crash 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;java.io.FileNotFoundException:&nbsp;/data/system/dropbox/drop19.tmp&nbsp;(Too&nbsp;many&nbsp;open&nbsp;files) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;java.io.FileOutputStream.open(Native&nbsp;Method) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;java.io.FileOutputStream.&lt;init&gt;(FileOutputStream.java:221) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;java.io.FileOutputStream.&lt;init&gt;(FileOutputStream.java:169) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;com.android.server.DropBoxManagerService.add(DropBoxManagerService.java:250) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;com.android.server.DropBoxManagerService\)2.add(DropBoxManagerService.java:129) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;android.os.DropBoxManager.addText(DropBoxManager.java:282) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;com.android.server.am.ActivityManagerService\(24.run(ActivityManagerService.java:14245) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;com.android.server.am.ActivityManagerService.addErrorToDropBox(ActivityManagerService.java:14252) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:13813) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;com.android.server.am.ActivityManagerService.handleApplicationCrash(ActivityManagerService.java:13797) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;com.android.internal.os.RuntimeInit\)UncaughtHandler.uncaughtException(RuntimeInit.java:176) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068) 10-11&nbsp;20:46:23.514&nbsp;1401&nbsp;1455&nbsp;E&nbsp;DropBoxManagerService:&nbsp;at&nbsp;java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;Failed&nbsp;looking&nbsp;up&nbsp;window 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;java.lang.IllegalArgumentException:&nbsp;Requested&nbsp;window&nbsp;android.view.ViewRootImpl\(W@e2ab8e8&nbsp;does&nbsp;not&nbsp;exist 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:9300) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:9291) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;com.android.server.wm.WindowManagerService.removeWindow(WindowManagerService.java:2411) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;com.android.server.wm.Session.remove(Session.java:193) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;android.view.ViewRootImpl.dispatchDetachedFromWindow(ViewRootImpl.java:3324) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;android.view.ViewRootImpl.doDie(ViewRootImpl.java:5938) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;android.view.ViewRootImpl.die(ViewRootImpl.java:5915) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;android.view.WindowManagerGlobal.removeViewLocked(WindowManagerGlobal.java:452) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:390) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:126) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;com.android.server.policy.PhoneWindowManager.addStartingWindow(PhoneWindowManager.java:2735) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;com.android.server.wm.WindowManagerService\)H.handleMessage(WindowManagerService.java:8290) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;android.os.Handler.dispatchMessage(Handler.java:102) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;android.os.Looper.loop(Looper.java:160) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;android.os.HandlerThread.run(HandlerThread.java:61) 10-11&nbsp;20:46:23.614&nbsp;1401&nbsp;1473&nbsp;W&nbsp;WindowManager:&nbsp;at&nbsp;com.android.server.ServiceThread.run(ServiceThread.java:46) 10-11&nbsp;20:46:23.615&nbsp;1401&nbsp;1455&nbsp;W&nbsp;ActivityManager:&nbsp;Force-killing&nbsp;crashed&nbsp;app&nbsp;null&nbsp;at&nbsp;watcher’s&nbsp;request

看到Log中有Too many open files,这就是FD泄露,默认每一个进程最多能够打开的文件数量为1024, 一旦达到预置,再试图打开一个文件时就会出错, 即Too many open files。如果看到这个异常,我们可以用lsof命令,对这个进程打开的所有文件进行监控:比如查看头条的进程打开的文件数量,这样下次发生的时候,就知道FD泄露的具体位置是在哪里了。

讯享网jason:/&nbsp;#&nbsp;ps&nbsp;-ef&nbsp;|grep&nbsp;com.ss.android.article.newsu0_a159&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7005&nbsp;&nbsp;1244&nbsp;5&nbsp;11:02:44&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:44&nbsp;com.ss.android.article.news u0_a159&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7093&nbsp;&nbsp;1244&nbsp;0&nbsp;11:02:45&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00&nbsp;com.ss.android.article.news:ad u0_a159&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7303&nbsp;&nbsp;1244&nbsp;0&nbsp;11:02:50&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:03&nbsp;com.ss.android.article.news:push u0_a159&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7384&nbsp;&nbsp;1244&nbsp;0&nbsp;11:02:51&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:01&nbsp;com.ss.android.article.news:pushservice root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8081&nbsp;&nbsp;6996&nbsp;11&nbsp;11:18:36&nbsp;pts/0&nbsp;00:00:00&nbsp;grep&nbsp;com.ss.android.article.news jason:/&nbsp;#&nbsp;jason:/&nbsp;#&nbsp;jason:/&nbsp;#&nbsp;jason:/&nbsp;#&nbsp;lsof&nbsp;-p&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMMAND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USER&nbsp;&nbsp;&nbsp;FD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEVICE&nbsp;&nbsp;SIZE/OFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NODE&nbsp;NAMEid.articl&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;cwd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;/id.articl&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;rtd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;/id.articl&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;259,37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;29116&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;781&nbsp;/system/bin/app_process32id.articl&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;259,37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;29116&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;781&nbsp;/system/bin/app_process32id.articl&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;unknown&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/dev/ashmem/dalvik-main&nbsp;space&nbsp;(region&nbsp;space)&nbsp;(deleted)id.articl&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;90112&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12288&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20480&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;53248&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;57344&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16384&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12288&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;36864&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12288&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;45056&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/dalvik-cache/arm/system@&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;259,37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1978&nbsp;/system/framework/arm/boot.oatid.articl&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;259,37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;26020&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1909&nbsp;/system/framework/arm/boot-QPerformance.oatid.articl&nbsp;&nbsp;7005&nbsp;&nbsp;&nbsp;&nbsp;u0_a159&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;259,37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1933&nbsp;/system/framework/arm/boot-core-oj.oat …..

含义:

COMMAND:进程的名称

PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称


讯享网

除了打开文件会申请fd之外,每打开一个socket都会增加一个fd,每次创建一个线程也会打开一个fd。系统中经常会有fd泄露的问题存在,所以O上发生NE时会将fd信息打印到tombstone文件中。对于JAVA的,只有自己想办法监控了。下面模拟一下FD泄露。

有些厂商会自己修改Max open files的值,比如华为,在小米手机上仍然是1024,我们可以在prop/pid/limits中查看。

2|jason:/proc/32194&nbsp;#&nbsp;cat&nbsp;limits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Limit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Soft&nbsp;Limit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hard&nbsp;Limit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Units&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;cpu&nbsp;time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seconds&nbsp;&nbsp;&nbsp; Max&nbsp;file&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;data&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;stack&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;core&nbsp;file&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;resident&nbsp;set&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22019&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22019&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processes&nbsp; Max&nbsp;open&nbsp;files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1024&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4096&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;locked&nbsp;memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;address&nbsp;space&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;file&nbsp;locks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;pending&nbsp;signals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22019&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22019&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signals&nbsp;&nbsp;&nbsp; Max&nbsp;msgqueue&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max&nbsp;nice&nbsp;priority&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max&nbsp;realtime&nbsp;priority&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max&nbsp;realtime&nbsp;timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;us

现在可以模拟一个fd泄露的问题,代码如下:

讯享网public&nbsp;class&nbsp;MainActivity&nbsp;extends&nbsp;Activity&nbsp;{&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onCreate(Bundle&nbsp;savedInstanceState)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.onCreate(savedInstanceState); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setContentView(R.layout.activity_main); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;view&nbsp;=&nbsp;findViewById(R.id.open_thread); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.setOnClickListener(new&nbsp;View.OnClickListener()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onClick(View&nbsp;view)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;1024;i++){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandlerThread&nbsp;&nbsp;&nbsp;mWorkHandler&nbsp;=&nbsp;new&nbsp;HandlerThread(“workHandlerThread”); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWorkHandler.start(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;} }

运行之后,几秒就crash了,抓一份284Log(或者去data/tombstone中),看一下trace。

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Build&nbsp;fingerprint:&nbsp;‘Xiaomi/jason/jason:8.1.0/OPM1..019/8.6.20:user/release-keys’Revision:&nbsp;‘0’ABI:&nbsp;‘arm64’pid:&nbsp;20303,&nbsp;tid:&nbsp;20800,&nbsp;name:&nbsp;workHandlerThre&nbsp;&nbsp;&gt;&gt;&gt;&nbsp;com.example.wangjing.rebootdemo&nbsp;&lt;&lt;&lt; signal&nbsp;6&nbsp;(SIGABRT),&nbsp;code&nbsp;-6&nbsp;(SI_TKILL),&nbsp;fault&nbsp;addr&nbsp;——– Abort&nbsp;message:&nbsp;‘Could&nbsp;not&nbsp;make&nbsp;wake&nbsp;event&nbsp;fd:&nbsp;Too&nbsp;many&nbsp;open&nbsp;files’ &nbsp;&nbsp;&nbsp;x0&nbsp;&nbsp;&nbsp;0000000000000000&nbsp;&nbsp;x1&nbsp;&nbsp;&nbsp;0000000000005140&nbsp;&nbsp;x2&nbsp;&nbsp;&nbsp;0000000000000006&nbsp;&nbsp;x3&nbsp;&nbsp;&nbsp;0000000000000008 &nbsp;&nbsp;&nbsp;x4&nbsp;&nbsp;&nbsp;0000000000000000&nbsp;&nbsp;x5&nbsp;&nbsp;&nbsp;0000000000000000&nbsp;&nbsp;x6&nbsp;&nbsp;&nbsp;0000000000000000&nbsp;&nbsp;x7&nbsp;&nbsp;&nbsp;7f7f7f7f7f7f7f7f &nbsp;&nbsp;&nbsp;x8&nbsp;&nbsp;&nbsp;0000000000000083&nbsp;&nbsp;x9&nbsp;&nbsp;&nbsp;3dbbf&nbsp;&nbsp;x10&nbsp;&nbsp;0000000000000000&nbsp;&nbsp;x11&nbsp;&nbsp;0000000000000001 &nbsp;&nbsp;&nbsp;x12&nbsp;&nbsp;ffffffffffffffff&nbsp;&nbsp;x13&nbsp;&nbsp;ffffffffffffffff&nbsp;&nbsp;x14&nbsp;&nbsp;ff00000000000000&nbsp;&nbsp;x15&nbsp;&nbsp;ffffffffffffffff &nbsp;&nbsp;&nbsp;x16&nbsp;&nbsp;000000025c938fa8&nbsp;&nbsp;x17&nbsp;&nbsp;000000719e6915c4&nbsp;&nbsp;x18&nbsp;&nbsp;0000000000000008&nbsp;&nbsp;x19&nbsp;&nbsp;0000000000004f4f &nbsp;&nbsp;&nbsp;x20&nbsp;&nbsp;0000000000005140&nbsp;&nbsp;x21&nbsp;&nbsp;00000070ea2e6800&nbsp;&nbsp;x22&nbsp;&nbsp;00000070e&nbsp;&nbsp;x23&nbsp;&nbsp;000000711ae3214a &nbsp;&nbsp;&nbsp;x24&nbsp;&nbsp;0000000000000000&nbsp;&nbsp;x25&nbsp;&nbsp;00000070e&nbsp;&nbsp;x26&nbsp;&nbsp;00000070ea2e68a0&nbsp;&nbsp;x27&nbsp;&nbsp;0000000000000000 &nbsp;&nbsp;&nbsp;x28&nbsp;&nbsp;0000000000000000&nbsp;&nbsp;x29&nbsp;&nbsp;00000070e5164b70&nbsp;&nbsp;x30&nbsp;&nbsp;000000719e646e38 &nbsp;&nbsp;&nbsp;sp&nbsp;&nbsp;&nbsp;00000070e5164b30&nbsp;&nbsp;pc&nbsp;&nbsp;&nbsp;000000719e646e54&nbsp;&nbsp;pstate&nbsp;00000000 &nbsp;&nbsp;&nbsp;v0&nbsp;&nbsp;&nbsp;2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e&nbsp;&nbsp;v1&nbsp;&nbsp;&nbsp;2ee676f6c2e570 &nbsp;&nbsp;&nbsp;v2&nbsp;&nbsp;&nbsp;00000070ef6f4c&nbsp;&nbsp;v3&nbsp;&nbsp;&nbsp;00000000000000000000000000000000 &nbsp;&nbsp;&nbsp;v4&nbsp;&nbsp;&nbsp;0000000000&nbsp;&nbsp;v5&nbsp;&nbsp;&nbsp;0000000000 &nbsp;&nbsp;&nbsp;v6&nbsp;&nbsp;&nbsp;00000000000000000000000000000000&nbsp;&nbsp;v7&nbsp;&nbsp;&nbsp;00 &nbsp;&nbsp;&nbsp;v8&nbsp;&nbsp;&nbsp;00000000000000000000000000000000&nbsp;&nbsp;v9&nbsp;&nbsp;&nbsp;00000000000000000000000000000000 &nbsp;&nbsp;&nbsp;v10&nbsp;&nbsp;00000000000000000000000000000000&nbsp;&nbsp;v11&nbsp;&nbsp;00000000000000000000000000000000 &nbsp;&nbsp;&nbsp;v12&nbsp;&nbsp;00000000000000000000000000000000&nbsp;&nbsp;v13&nbsp;&nbsp;00000000000000000000000000000000 &nbsp;&nbsp;&nbsp;v14&nbsp;&nbsp;00000000000000000000000000000000&nbsp;&nbsp;v15&nbsp;&nbsp;00000000000000000000000000000000 &nbsp;&nbsp;&nbsp;v16&nbsp;&nbsp;00&nbsp;&nbsp;v17&nbsp;&nbsp;a0080000a0000000a800a000 &nbsp;&nbsp;&nbsp;v18&nbsp;&nbsp;0000000000&nbsp;&nbsp;v19&nbsp;&nbsp;00000000000000000000000000000000 &nbsp;&nbsp;&nbsp;v20&nbsp;&nbsp;00000000000000000000000000000000&nbsp;&nbsp;v21&nbsp;&nbsp;00000000000000000000000000000000 &nbsp;&nbsp;&nbsp;v22&nbsp;&nbsp;00000000000000000000000000000000&nbsp;&nbsp;v23&nbsp;&nbsp;000000000000000000000000433b0000 &nbsp;&nbsp;&nbsp;v24&nbsp;&nbsp;0000000000000000000000003f&nbsp;&nbsp;v25&nbsp;&nbsp;0000000000000000000000003f &nbsp;&nbsp;&nbsp;v26&nbsp;&nbsp;000000000000000000000071a011ebcc&nbsp;&nbsp;v27&nbsp;&nbsp;000000000000000000000071a011ec24 &nbsp;&nbsp;&nbsp;v28&nbsp;&nbsp;000000000000000000000071a011ef64&nbsp;&nbsp;v29&nbsp;&nbsp;000000000000000000000071a011e5bc &nbsp;&nbsp;&nbsp;v30&nbsp;&nbsp;000000000000000000000071a011e7b4&nbsp;&nbsp;v31&nbsp;&nbsp;000000000000000000000071a011e8e8 &nbsp;&nbsp;&nbsp;fpsr&nbsp;00000013&nbsp;&nbsp;fpcr&nbsp;00000000backtrace:&nbsp;&nbsp;&nbsp;#00&nbsp;pc&nbsp;000000000001de54&nbsp;&nbsp;/system/lib64/libc.so&nbsp;(abort+104) &nbsp;&nbsp;&nbsp;#01&nbsp;pc&nbsp;0000000000007f20&nbsp;&nbsp;/system/lib64/liblog.so&nbsp;(__android_log_assert+304) &nbsp;&nbsp;&nbsp;#02&nbsp;pc&nbsp;00000000000154d0&nbsp;&nbsp;/system/lib64/libutils.so&nbsp;(android::Looper::Looper(bool)+296) &nbsp;&nbsp;&nbsp;#03&nbsp;pc&nbsp;00000000001114b8&nbsp;&nbsp;/system/lib64/libandroid_runtime.so&nbsp;(android::NativeMessageQueue::NativeMessageQueue()+160) &nbsp;&nbsp;&nbsp;#04&nbsp;pc&nbsp;0000000000111de8&nbsp;&nbsp;/system/lib64/libandroid_runtime.so&nbsp;(android::android_os_MessageQueue_nativeInit(_JNIEnv,&nbsp;_jclass)+28) &nbsp;&nbsp;&nbsp;#05&nbsp;pc&nbsp;00000000009c88e0&nbsp;&nbsp;/system/framework/arm64/boot-framework.oat&nbsp;(offset&nbsp;0x9c6000)&nbsp;(android.os.Binder.clearCallingIdentity&nbsp;[DEDUPED]+144) &nbsp;&nbsp;&nbsp;#06&nbsp;pc&nbsp;000000000054904c&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art_quick_invoke_static_stub+604) &nbsp;&nbsp;&nbsp;#07&nbsp;pc&nbsp;00000000000dcfb4&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art::ArtMethod::Invoke(art::Thread,&nbsp;unsigned&nbsp;int,&nbsp;unsigned&nbsp;int,&nbsp;art::JValue,&nbsp;char&nbsp;const)+260) &nbsp;&nbsp;&nbsp;#08&nbsp;pc&nbsp;000000000029a950&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread,&nbsp;art::ArtMethod,&nbsp;art::ShadowFrame,&nbsp;unsigned&nbsp;short,&nbsp;art::JValue)+344) &nbsp;&nbsp;&nbsp;#09&nbsp;pc&nbsp;0000000000294f40&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(_ZN3art11interpreter6DoCallILb0ELb0EEEbPNS_9ArtMethodEPNS_6ThreadERNS_11ShadowFrameEPKNS_11InstructionEtPNS_6JValueE+696) &nbsp;&nbsp;&nbsp;#10&nbsp;pc&nbsp;0000000000&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(MterpInvokeStatic+224) &nbsp;&nbsp;&nbsp;#11&nbsp;pc&nbsp;000000000053ab94&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(ExecuteMterpImpl+14612) &nbsp;&nbsp;&nbsp;#12&nbsp;pc&nbsp;00000000002753a4&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art::interpreter::Execute(art::Thread,&nbsp;art::DexFile::CodeItem&nbsp;const,&nbsp;art::ShadowFrame&amp;,&nbsp;art::JValue,&nbsp;bool)+444) &nbsp;&nbsp;&nbsp;#13&nbsp;pc&nbsp;000000000027afac&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread,&nbsp;art::DexFile::CodeItem&nbsp;const,&nbsp;art::ShadowFrame,&nbsp;art::JValue)+216) &nbsp;&nbsp;&nbsp;#14&nbsp;pc&nbsp;0000000000294f20&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(_ZN3art11interpreter6DoCallILb0ELb0EEEbPNS_9ArtMethodEPNS_6ThreadERNS_11ShadowFrameEPKNS_11InstructionEtPNS_6JValueE+664) &nbsp;&nbsp;&nbsp;#15&nbsp;pc&nbsp;000000000053209c&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(MterpInvokeDirect+304) &nbsp;&nbsp;&nbsp;#16&nbsp;pc&nbsp;000000000053ab14&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(ExecuteMterpImpl+14484) &nbsp;&nbsp;&nbsp;#17&nbsp;pc&nbsp;00000000002753a4&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art::interpreter::Execute(art::Thread,&nbsp;art::DexFile::CodeItem&nbsp;const,&nbsp;art::ShadowFrame&amp;,&nbsp;art::JValue,&nbsp;bool)+444) &nbsp;&nbsp;&nbsp;#18&nbsp;pc&nbsp;000000000027afac&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread,&nbsp;art::DexFile::CodeItem&nbsp;const,&nbsp;art::ShadowFrame,&nbsp;art::JValue)+216) &nbsp;&nbsp;&nbsp;#19&nbsp;pc&nbsp;0000000000294f20&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(_ZN3art11interpreter6DoCallILb0ELb0EEEbPNS_9ArtMethodEPNS_6ThreadERNS_11ShadowFrameEPKNS_11InstructionEtPNS_6JValueE+664) &nbsp;&nbsp;&nbsp;#20&nbsp;pc&nbsp;000000000053209c&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(MterpInvokeDirect+304) &nbsp;&nbsp;&nbsp;#21&nbsp;pc&nbsp;000000000053ab14&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(ExecuteMterpImpl+14484) &nbsp;&nbsp;&nbsp;#22&nbsp;pc&nbsp;00000000002753a4&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art::interpreter::Execute(art::Thread,&nbsp;art::DexFile::CodeItem&nbsp;const,&nbsp;art::ShadowFrame&amp;,&nbsp;art::JValue,&nbsp;bool)+444) &nbsp;&nbsp;&nbsp;#23&nbsp;pc&nbsp;000000000027afac&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread,&nbsp;art::DexFile::CodeItem&nbsp;const,&nbsp;art::ShadowFrame,&nbsp;art::JValue)+216) &nbsp;&nbsp;&nbsp;#24&nbsp;pc&nbsp;0000000000294f20&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(_ZN3art11interpreter6DoCallILb0ELb0EEEbPNS_9ArtMethodEPNS_6ThreadERNS_11ShadowFrameEPKNS_11InstructionEtPNS_6JValueE+664) &nbsp;&nbsp;&nbsp;#25&nbsp;pc&nbsp;0000000000&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(MterpInvokeStatic+224) &nbsp;&nbsp;&nbsp;#26&nbsp;pc&nbsp;000000000053ab94&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(ExecuteMterpImpl+14612) &nbsp;&nbsp;&nbsp;#27&nbsp;pc&nbsp;00000000002753a4&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art::interpreter::Execute(art::Thread,&nbsp;art::DexFile::CodeItem&nbsp;const,&nbsp;art::ShadowFrame&amp;,&nbsp;art::JValue,&nbsp;bool)+444) &nbsp;&nbsp;&nbsp;#28&nbsp;pc&nbsp;0000000000523ab4&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(artQuickToInterpreterBridge+1052) &nbsp;&nbsp;&nbsp;#29&nbsp;pc&nbsp;0000000000551f0c&nbsp;&nbsp;/system/lib64/libart.so&nbsp;(art_quick_to_interpreter_bridge+92) &nbsp;&nbsp;&nbsp;#30&nbsp;pc&nbsp;000000000000a080&nbsp;&nbsp;/dev/ashmem/dalvik-jit-code-cache&nbsp;(deleted)

果然出现了Could not make wake event fd: Too many open files。

讯享网pid:&nbsp;20303,&nbsp;tid:&nbsp;20800,&nbsp;name:&nbsp;workHandlerThre&nbsp;&nbsp;&gt;&gt;&gt;&nbsp;com.example.wangjing.rebootdemo&nbsp;&lt;&lt;&lt;

现在就需要去代码中查找workHandlerThread是什么了。

三、如何创建一个进程

#include&nbsp;&lt;unistd.h&gt;#include&nbsp;&lt;stdio.h&gt;#include&nbsp;&lt;wait.h&gt;int&nbsp;main()&nbsp;{&nbsp;&nbsp;&nbsp;int&nbsp;count&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;pid_t&nbsp;fpid&nbsp;=&nbsp;fork();&nbsp;&nbsp;&nbsp;if&nbsp;(fpid&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(”创建父子进程失败!”); &nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(fpid&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(”子进程ID:%d “,&nbsp;getpid()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++; &nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(”父进程ID:%d “,&nbsp;getpid()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count=10; &nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;printf(“count=%d “,&nbsp;count); &nbsp;&nbsp;&nbsp;waitpid(fpid,&nbsp;NULL,&nbsp;0);&nbsp;&nbsp;&nbsp;return&nbsp;0; }
讯享网/home/wangjing/CLionProjects/untitled/cmake-build-debug/untitled 父进程ID:15229count=10子进程ID:15230count=1Process&nbsp;finished&nbsp;with&nbsp;exit&nbsp;code&nbsp;0

通过打印的结果有两点重要信息需要get。

利用fork()函数将整个程序分成了两半,在pid_t fpid==0是子进程执行的分支,大于0则是父进程执行的分支。 count=0这个变量被原封不动地拷贝到这两个分支之中。

Picture

一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。 其实进程的fork基于写时复制技术,相对与传统fork技术更加高效。何为写时复制技术呢?

内核只为新生成的子进程创建虚拟空间结构,它们来复制于父进程的虚拟究竟结构,但是不为这些段分配物理内存,它们共享父进程的物理空间,当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。

假设现在有一个进程p1,包括正文段(可重入的程序,能被若干进程共享,比如代码等),数据段(用于保存程序已经初始化的变量),堆,栈。也有文件描述符等。

Picture

可以看到传统的fork系统调用直接把父进程所有的资源复制给新创建的进程,如果这时子进程执行exec函数系统调用,那么这种复制毫无意义,在看写时复制技术。

Picture

fork()之后父进程的将自己的虚拟空间拷贝给子进程,使得子进程可以共享父进程的物理空间,节省了很多物理内存。等到子进程需要写的时候,内核会为子进程分配数据段,堆,栈等,而正文段段继续共享父进程的。很显然,基于写时复制,进程的创建会更加高效。

四、进程信号

进程间的通信除了上层所说的socket,binder,管道等等,还可以用信号来交流,信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。系统支持的所有信号如下所示:

4.1信号种类

Android系统中的信号我们可以用 adb shell kill -l 查看

wangjing@wangjing-OptiPlex-7050:\(&nbsp;adb&nbsp;shell&nbsp;kill&nbsp;-l&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;HUP&nbsp;Hangup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;33&nbsp;Signal&nbsp;33 &nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;Interrupt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;34&nbsp;Signal&nbsp;34 &nbsp;3&nbsp;&nbsp;&nbsp;QUIT&nbsp;Quit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;35&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;35&nbsp;Signal&nbsp;35 &nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;ILL&nbsp;Illegal&nbsp;instruction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;36&nbsp;Signal&nbsp;36 &nbsp;5&nbsp;&nbsp;&nbsp;TRAP&nbsp;Trap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;37&nbsp;Signal&nbsp;37 &nbsp;6&nbsp;&nbsp;&nbsp;ABRT&nbsp;Aborted&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;38&nbsp;Signal&nbsp;38 &nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;BUS&nbsp;Bus&nbsp;error&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;39&nbsp;Signal&nbsp;39 &nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;FPE&nbsp;Floating&nbsp;point&nbsp;exception&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;Signal&nbsp;40 &nbsp;9&nbsp;&nbsp;&nbsp;KILL&nbsp;Killed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;41&nbsp;Signal&nbsp;4110&nbsp;&nbsp;&nbsp;USR1&nbsp;User&nbsp;signal&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;42&nbsp;Signal&nbsp;4211&nbsp;&nbsp;&nbsp;SEGV&nbsp;Segmentation&nbsp;fault&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;43&nbsp;Signal&nbsp;4312&nbsp;&nbsp;&nbsp;USR2&nbsp;User&nbsp;signal&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;44&nbsp;Signal&nbsp;4413&nbsp;&nbsp;&nbsp;PIPE&nbsp;Broken&nbsp;pipe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;45&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;45&nbsp;Signal&nbsp;4514&nbsp;&nbsp;&nbsp;ALRM&nbsp;Alarm&nbsp;clock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;46&nbsp;Signal&nbsp;4615&nbsp;&nbsp;&nbsp;TERM&nbsp;Terminated&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;47&nbsp;Signal&nbsp;4716&nbsp;STKFLT&nbsp;Stack&nbsp;fault&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;48&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;48&nbsp;Signal&nbsp;4817&nbsp;&nbsp;&nbsp;CHLD&nbsp;Child&nbsp;exited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;49&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;49&nbsp;Signal&nbsp;4918&nbsp;&nbsp;&nbsp;CONT&nbsp;Continue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;Signal&nbsp;5019&nbsp;&nbsp;&nbsp;STOP&nbsp;Stopped&nbsp;(signal)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;51&nbsp;Signal&nbsp;5120&nbsp;&nbsp;&nbsp;TSTP&nbsp;Stopped&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;52&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;52&nbsp;Signal&nbsp;5221&nbsp;&nbsp;&nbsp;TTIN&nbsp;Stopped&nbsp;(tty&nbsp;input)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;53&nbsp;Signal&nbsp;5322&nbsp;&nbsp;&nbsp;TTOU&nbsp;Stopped&nbsp;(tty&nbsp;output)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;54&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;54&nbsp;Signal&nbsp;5423&nbsp;&nbsp;&nbsp;&nbsp;URG&nbsp;Urgent&nbsp;I/O&nbsp;condition&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;55&nbsp;Signal&nbsp;5524&nbsp;&nbsp;&nbsp;XCPU&nbsp;CPU&nbsp;time&nbsp;limit&nbsp;exceeded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;56&nbsp;Signal&nbsp;5625&nbsp;&nbsp;&nbsp;XFSZ&nbsp;File&nbsp;size&nbsp;limit&nbsp;exceeded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;57&nbsp;Signal&nbsp;5726&nbsp;VTALRM&nbsp;Virtual&nbsp;timer&nbsp;expired&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;58&nbsp;Signal&nbsp;5827&nbsp;&nbsp;&nbsp;PROF&nbsp;Profiling&nbsp;timer&nbsp;expired&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;59&nbsp;Signal&nbsp;5928&nbsp;&nbsp;WINCH&nbsp;Window&nbsp;size&nbsp;changed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;Signal&nbsp;6029&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO&nbsp;I/O&nbsp;possible&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;61&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;61&nbsp;Signal&nbsp;6130&nbsp;&nbsp;&nbsp;&nbsp;PWR&nbsp;Power&nbsp;failure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;62&nbsp;Signal&nbsp;6231&nbsp;&nbsp;&nbsp;&nbsp;SYS&nbsp;Bad&nbsp;system&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;63&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;63&nbsp;Signal&nbsp;6332&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32&nbsp;Signal&nbsp;32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;64&nbsp;Signal&nbsp;64</pre><h5>4.1&#20449;&#21495;&#30340;&#20135;&#29983;</h5><p>&#25105;&#20204;&#21487;&#20197;&#20351;&#29992;\) adb shell kill -{signum} {pid}给对应的进程发送信号,如果遇到系统卡死,需要抓取system_server的trace,就可以使用kill -3。
讯享网&nbsp;adb&nbsp;shell&nbsp;kill&nbsp;&nbsp;-3&nbsp;&nbsp;systemserver_pid
生成的system_server trace在data/anr/traces.txt中。
在APP发送Native Crash或者系统发送Native Crash的时候,会发送对应的信号,一个有经验的程序员就会知道这种信号的意思。
写一个系统发送信号的小例子
#include&nbsp;&lt;stdio.h&gt;#include&nbsp;&lt;unistd.h&gt;int&nbsp;main(){&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*str&nbsp;=&nbsp;“signal”; &nbsp;&nbsp;&nbsp;&nbsp;*str&nbsp;=&nbsp;‘a’;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;printf(“%s “,&nbsp;str);&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; }
gcc编译成可运行的程序
讯享网gcc&nbsp;signal.c&nbsp;-g&nbsp;-o&nbsp;signalApp
开始运行
wangjing@wangjing-OptiPlex-7050:/桌面\(&nbsp;https://www.imooc.com/article/signalApp&nbsp; &#27573;&#38169;&#35823;&nbsp;(&#26680;&#24515;&#24050;&#36716;&#20648;)</pre><p>&#21457;&#29616;&#38169;&#35823;&#65292;&#24320;&#22987;&#35843;&#35797;</p><pre>wangjing@wangjing-OptiPlex-7050:~/&#26700;&#38754;\)&nbsp;gdb&nbsp;signalApp&nbsp; GNU&nbsp;gdb&nbsp;(Ubuntu&nbsp;7.11.1-0ubuntu1~16.5)&nbsp;7.11.1Copyright&nbsp;©&nbsp;2016&nbsp;Free&nbsp;Software&nbsp;Foundation,&nbsp;Inc. License&nbsp;GPLv3+:&nbsp;GNU&nbsp;GPL&nbsp;version&nbsp;3&nbsp;or&nbsp;later&nbsp;&lt;http://gnu.org/licenses/gpl.html&gt;This&nbsp;is&nbsp;free&nbsp;software:&nbsp;you&nbsp;are&nbsp;free&nbsp;to&nbsp;change&nbsp;and&nbsp;redistribute&nbsp;it. There&nbsp;is&nbsp;NO&nbsp;WARRANTY,&nbsp;to&nbsp;the&nbsp;extent&nbsp;permitted&nbsp;by&nbsp;law.&nbsp;&nbsp;Type&nbsp;“show&nbsp;copying”and&nbsp;“show&nbsp;warranty”&nbsp;for&nbsp;details. This&nbsp;GDB&nbsp;was&nbsp;configured&nbsp;as&nbsp;“x86_64-linux-gnu”. Type&nbsp;“show&nbsp;configuration”&nbsp;for&nbsp;configuration&nbsp;details.For&nbsp;bug&nbsp;reporting&nbsp;instructions,&nbsp;please&nbsp;see: &lt;http://www.gnu.org/software/gdb/bugs/&gt;.Find&nbsp;the&nbsp;GDB&nbsp;manual&nbsp;and&nbsp;other&nbsp;documentation&nbsp;resources&nbsp;online&nbsp;at: &lt;http://www.gnu.org/software/gdb/documentation/&gt;.For&nbsp;help,&nbsp;type&nbsp;“help”. Type&nbsp;“apropos&nbsp;word”&nbsp;to&nbsp;search&nbsp;for&nbsp;commands&nbsp;related&nbsp;to&nbsp;“word”… Reading&nbsp;symbols&nbsp;from&nbsp;signalApp…done. (gdb)&nbsp;r Starting&nbsp;program:&nbsp;/home/wangjing/桌面/signalApp&nbsp; Program&nbsp;received&nbsp;signal&nbsp;SIGSEGV,&nbsp;Segmentation&nbsp;fault.0x000000000040053a&nbsp;in&nbsp;main&nbsp;()&nbsp;at&nbsp;signal.c:66&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*str&nbsp;=&nbsp;‘a’;&nbsp; (gdb)
可以看到信号是SIGSEGV(11),这是一个段错误,11我们最常见的信号,分SEGV_MAPERR和SEGV_ACCERR两种。第一种是SEGV_MAPERR,意为地址不在进程地址空间内时触发,比如:
讯享网pid:&nbsp;1219,&nbsp;tid:&nbsp;1219,&nbsp;name:&nbsp;ndroid.systemui&nbsp;&gt;&gt;&gt;&nbsp;com.android.systemui&nbsp;&lt;&lt;&lt; signal&nbsp;11&nbsp;(SIGSEGV),&nbsp;code&nbsp;1&nbsp;(SEGV_MAPERR),&nbsp;fault&nbsp;addr&nbsp;00000000r0&nbsp;00000000&nbsp;r1&nbsp;00000000&nbsp;r2&nbsp;000010a0&nbsp;r3&nbsp;00000175r4&nbsp;be9bc150&nbsp;r5&nbsp;00000000&nbsp;r6&nbsp;be9bbfac&nbsp;r7&nbsp;d r8&nbsp;00000174&nbsp;r9&nbsp;00001200&nbsp;sl&nbsp;00001200&nbsp;fp&nbsp;000010e0ip&nbsp;40664b9c&nbsp;sp&nbsp;be9bbf8c&nbsp;lr&nbsp;&nbsp;pc&nbsp;&nbsp;cpsr&nbsp;200f0010 backtrace:#00&nbsp;pc&nbsp;00022310&nbsp;/system/lib/libc.so&nbsp;(memset+24)#01&nbsp;pc&nbsp;000b66ff&nbsp;/system/lib/libskia.so&nbsp;(SkDraw::drawPaint(SkPaint&nbsp;const&amp;)&nbsp;const+286)#02&nbsp;pc&nbsp;000b1023&nbsp;/system/lib/libskia.so&nbsp;(SkCanvas::internalDrawPaint(SkPaint&nbsp;const&amp;)+66)#03&nbsp;pc&nbsp;000aff65&nbsp;/system/lib/libskia.so&nbsp;(SkCanvas::drawColor(unsigned&nbsp;int,&nbsp;SkXfermode::Mode)+44)#04&nbsp;pc&nbsp;0002034c&nbsp;/system/lib/libdvm.so&nbsp;(dvmPlatformInvoke+112)
从调用栈中可以看出,程序执行到memset+24的位置时,cpu发现异常。我们可以通过gdb或者objdump工具查看这个汇编:
(gdb)&nbsp;disassemble&nbsp;0xf8Dump&nbsp;of&nbsp;assembler&nbsp;code&nbsp;for&nbsp;function&nbsp;memset: &nbsp;&nbsp;&nbsp;0xf8&nbsp;&lt;+0&gt;:&nbsp;&nbsp;&nbsp;&nbsp;stmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0}&nbsp;&nbsp;&nbsp;0xfc&nbsp;&lt;+4&gt;:&nbsp;&nbsp;&nbsp;&nbsp;vdup.8&nbsp;&nbsp;&nbsp;&nbsp;q0,&nbsp;r1&nbsp;&nbsp;&nbsp;0x&nbsp;&lt;+8&gt;:&nbsp;&nbsp;&nbsp;&nbsp;subs&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r2,&nbsp;#32 &nbsp;&nbsp;&nbsp;0x&nbsp;&lt;+12&gt;:&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;0x4012e318&nbsp;&lt;memset+32&gt;&nbsp;&nbsp;&nbsp;0x&nbsp;&lt;+16&gt;:&nbsp;&nbsp;&nbsp;&nbsp;vorr&nbsp;&nbsp;&nbsp;&nbsp;q1,&nbsp;q0,&nbsp;q0&nbsp;&nbsp;&nbsp;0xc&nbsp;&lt;+20&gt;:&nbsp;&nbsp;&nbsp;&nbsp;subs&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r2,&nbsp;#32 &nbsp;&nbsp;&nbsp;0x&nbsp;&lt;+24&gt;:&nbsp;&nbsp;&nbsp;&nbsp;vst1.8&nbsp;&nbsp;&nbsp;&nbsp;{d0-d3},&nbsp;[r0]!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt;&lt;
可以看到是把d0-d3寄存器的值写到r0寄存器指向的地址时发生的异常。我们可以从r0寄存器的值可以知道,这个地址是0x00000000,而0x00000000不在进程地址空间范围内,所以会引起SEGV_MAPERR错误。“fault addr 00000000” 这个信息也能说明问题,但我们不看汇编不能确定是哪个寄存器(r0和r1都有可能)。看了汇编后能确定是r0,也就是memset的第一个参数为空导致了这个问题。第二种为SEGV_ACCERR,意为地址在进程地址空间内,但访问权限不够时触发,比如
讯享网Build&nbsp;fingerprint:&nbsp;‘Xiaomi/virgo/virgo:6.0.1/MMB29M/7.1.19-internal:user/test-keys’Revision:&nbsp;‘0’ABI:&nbsp;‘arm’pid:&nbsp;26620,&nbsp;tid:&nbsp;26867,&nbsp;name:&nbsp;DetectorThread&nbsp;&nbsp;&gt;&gt;&gt;&nbsp;com.linecorp.b612.android&nbsp;&lt;&lt;&lt; signal&nbsp;11&nbsp;(SIGSEGV),&nbsp;code&nbsp;2&nbsp;(SEGV_ACCERR),&nbsp;fault&nbsp;addr&nbsp;0x9577b090 &nbsp;&nbsp;&nbsp;&nbsp;r0&nbsp;00000034&nbsp;&nbsp;r1&nbsp;9591b000&nbsp;&nbsp;r2&nbsp;00001000&nbsp;&nbsp;r3&nbsp;12ced228 &nbsp;&nbsp;&nbsp;&nbsp;r4&nbsp;b4a7f378&nbsp;&nbsp;r5&nbsp;000010e9&nbsp;&nbsp;r6&nbsp;b46d73cb&nbsp;&nbsp;r7&nbsp;000010e9 &nbsp;&nbsp;&nbsp;&nbsp;r8&nbsp;9577ae70&nbsp;&nbsp;r9&nbsp;00000004&nbsp;&nbsp;sl&nbsp;00000004&nbsp;&nbsp;fp&nbsp;b6cc3050 &nbsp;&nbsp;&nbsp;&nbsp;ip&nbsp;00001000&nbsp;&nbsp;sp&nbsp;9577ae10&nbsp;&nbsp;lr&nbsp;b6c8acf5&nbsp;&nbsp;pc&nbsp;9577b090&nbsp;&nbsp;cpsr&nbsp;200f0010 &nbsp; backtrace:&nbsp;&nbsp;&nbsp;&nbsp;#00&nbsp;pc&nbsp;00&nbsp;&nbsp;[stack:26620] &nbsp;&nbsp;&nbsp;&nbsp;#01&nbsp;pc&nbsp;00047cf1&nbsp;&nbsp;/system/lib/libc.so&nbsp;(__sread+16) &nbsp;&nbsp;&nbsp;&nbsp;#02&nbsp;pc&nbsp;000025b4&nbsp;&nbsp;/system/lib/libart.so&nbsp;(offset&nbsp;0x44d000)
fault addr 0x9577b090, SEGV_ACCERR错误指的是访问权限的问题,如写只读段,或者是执行数据段的内容.寄存器的值中发现PC是pc 9577b090,那么有可能是地址9577b090所处的段的属性有问题.查看tombstone中的maps信息:
&nbsp;&nbsp;&nbsp;&nbsp;-95678fff&nbsp;—&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1000—&gt;-9577bfff&nbsp;rw-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[stack:26620]&nbsp;&nbsp;&nbsp;&nbsp;9577c000-9578cfff&nbsp;rw-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a9000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11000&nbsp;&nbsp;/dev/kgsl-3d0
0x9577b090处在区间[,9577bfff]内,这段地址是有rw权限的,少的是x权限,也就是可执行权限。所以抛出了SEGV_ACCERR的错误,这种一般是函数指针被某一个家伙覆盖导致的。进程信号有很多种,不一一赘述,掌握这些信号的常见场景,需要一定经验和时间。原文链接:http://www.apkbus.com/blog-847095-78394.html
小讯
上一篇 2025-04-23 09:49
下一篇 2025-04-26 16:48

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/148048.html