<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=init%E8%BF%9B%E7%A8%8B%E8%B0%83%E8%AF%95</id>
	<title>init进程调试 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=init%E8%BF%9B%E7%A8%8B%E8%B0%83%E8%AF%95"/>
	<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=init%E8%BF%9B%E7%A8%8B%E8%B0%83%E8%AF%95&amp;action=history"/>
	<updated>2026-09-01T05:28:14Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=init%E8%BF%9B%E7%A8%8B%E8%B0%83%E8%AF%95&amp;diff=810&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 08:35 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=init%E8%BF%9B%E7%A8%8B%E8%B0%83%E8%AF%95&amp;diff=810&amp;oldid=prev"/>
		<updated>2015-05-06T08:35:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;调试的原因很简单，就是出现问题了：把一个进程的启动顺序提前，但实际却启动不起来，如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on fs_property:ro.mount.fs=EXT4&lt;br /&gt;
    start my_daemon&lt;br /&gt;
&lt;br /&gt;
on init&lt;br /&gt;
start my_daemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
于是要想办法把log打印出来。但在开机前期，log系统、文件系统都还未就绪，因此这不是一个简单的事情。&lt;br /&gt;
&lt;br /&gt;
于是想先把log打印到一个buffer中，待系统启动后再通过通用的log系统打印出来：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX_LEN (1024*1024*10)&lt;br /&gt;
char g_kBuffer[MAX_LEN] = {&amp;quot;head\n&amp;quot;};&lt;br /&gt;
int g_occupiedByte = 5;&lt;br /&gt;
void logToBuffer(char *format, ... ) {&lt;br /&gt;
    char *m_str = g_kBuffer+g_occupiedByte;    &lt;br /&gt;
    va_list arg_ptr;&lt;br /&gt;
    va_start(arg_ptr, format);&lt;br /&gt;
    vsnprintf(m_str, MAX_LEN-g_occupiedByte-1, format, arg_ptr); //vsprintf    &lt;br /&gt;
    va_end(arg_ptr);&lt;br /&gt;
    if(g_kBuffer[strlen(g_kBuffer)-1] != &amp;#039;\n&amp;#039;) {&lt;br /&gt;
        strncat(g_kBuffer, &amp;quot;\n&amp;quot;, MAX_LEN);&lt;br /&gt;
    }&lt;br /&gt;
    g_occupiedByte = strlen(g_kBuffer);    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//受log系统打印长度限制，需分段打印&lt;br /&gt;
void printKBuffer() {&lt;br /&gt;
	#define KLOG_MAX_LEN 300&lt;br /&gt;
	int i = 0;&lt;br /&gt;
	char tmpStr[KLOG_MAX_LEN];&lt;br /&gt;
	for(i = 0; i &amp;lt; strlen(g_kBuffer);) {&lt;br /&gt;
		strncpy(tmpStr, (char*)(g_kBuffer+i), KLOG_MAX_LEN);&lt;br /&gt;
		klog_write(1, &amp;quot;logyfish&amp;gt;|%s\n&amp;quot;, tmpStr);&lt;br /&gt;
		i+=KLOG_MAX_LEN;&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void* logDaemonTrd(void *ptr) {&lt;br /&gt;
    //sleep(20);&lt;br /&gt;
    while(1) {&lt;br /&gt;
        klog_write(1, &amp;quot;\n======================logyfish start=========================\n&amp;quot;);&lt;br /&gt;
        printKBuffer();//klog_write(1, &amp;quot;&amp;gt;|%s\n&amp;quot;, g_kBuffer);&lt;br /&gt;
		klog_write(1, &amp;quot;\n======================logyfish end=========================\n&amp;quot;);	&lt;br /&gt;
        sleep(3);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return NULL;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后再在init的main中启动一个线程用来打印log：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
    //start:logyfish&lt;br /&gt;
    pthread_t ssdTrd = 0;&lt;br /&gt;
    pthread_create(&amp;amp;ssdTrd, NULL, logDaemonTrd, NULL);&lt;br /&gt;
    //end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最后再在需要的地方加上log，如 execute_one_command和 service_start函数.&lt;br /&gt;
&lt;br /&gt;
打印log如下：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130331] (2)[81:init]======================logyfish start=========================&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130444] (2)[81:init]logyfish&amp;gt;|head&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130450] (2)[81:init]processing action 0xa43ba8 (early-init)&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130457] (2)[81:init]command r=0 &amp;#039; write /proc/1/oom_adj -16&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130464] (2)[81:init]command r=0 &amp;#039; setcon u:r:init:s0&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130470] (2)[81:init]starting &amp;#039;ueventd&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130475] (2)[81:init]==&amp;gt;ueventd ruunning&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130481] (2)[81:init]command r=0 &amp;#039; start ueventd&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130487] (2)[81:init]command r=0 &amp;#039; mkdir /mnt 0775 root system&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130494] (2)[81:init]processing action 0xa59430 (early-init)&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130500] (2)[81:init]processing action 0xa5a380 (e&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130600] (2)[81:init]logyfish&amp;gt;|arly-init)&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130606] (2)[81:init]command r=0 &amp;#039; mkdir /protect_f 0771 system system&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130613] (2)[81:init]command r=0 &amp;#039; mkdir /protect_s 0771 system system&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130621] (2)[81:init]processing action 0xa5bed0 (wait_for_coldboot_done)&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130628] (2)[81:init]command r=0 &amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130633] (2)[81:init]processing action 0xa5bf18 (keychord_init)&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130640] (2)[81:init]command r=0 &amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130645] (2)[81:init]processing action 0xa5bf60 (console_init)&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130652] (2)[81:init]command r=0 &amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130657] (2)[81:init]proce&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130751] (2)[81:init]logyfish&amp;gt;|ssing action 0xa372d0 (init)&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130758] (2)[81:init]command r=0 &amp;#039; write /proc/self/coredump_filter 39&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130765] (2)[81:init]processing action 0xa43e48 (init)&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130772] (2)[81:init]cannot find &amp;#039;/system/bin/my_daemon&amp;#039;, disabling &amp;#039;my_daemon&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130780] (2)[81:init]command r=0 &amp;#039; start my_daemon&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130786] (2)[81:init]command r=0 &amp;#039; sysclktz 0&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.130792] (2)[81:init]command r=0 &amp;#039; loglevel 6&amp;#039;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.132748] (2)[81:init]processing action 0xa43708 (fs_property:ro.mount.fs=EXT4)&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.132755] (2)[81:init]cannot find &amp;#039;/system/bin/my_daemon&amp;#039;, disabling &amp;#039;my_daemon&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.132763] (2)[81:init]command r=0 &amp;#039; start my_daemon&amp;#039;&lt;br /&gt;
&amp;lt;4&amp;gt;[   55.132770] (2)[81:init]processing action 0xa44c38 (fs_property:ro.mount.fs=EXT4)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
cannot find &amp;#039;/system/bin/my_daemon&amp;#039;, disabling &amp;#039;my_daemon&amp;#039; ==&amp;gt;可知是此时/system分区还未就绪导致启动失败，同时这种情况下系统还会自动给 service加入 DISABLED属性：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
    if (stat(svc-&amp;gt;args[0], &amp;amp;s) != 0) {&lt;br /&gt;
        logToBuffer(&amp;quot;cannot find &amp;#039;%s&amp;#039;, disabling &amp;#039;%s&amp;#039;\n&amp;quot;, svc-&amp;gt;args[0], svc-&amp;gt;name);&lt;br /&gt;
        svc-&amp;gt;flags |= SVC_DISABLED;&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所以现在知道解决方案了，就是要确保在对应可执行文件所在文件系统就绪后再启动 service：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on post-fs-data&lt;br /&gt;
    start my_daemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
问题顺势而解！&lt;/div&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
</feed>