init进程log抓取

 adb logcat -b events   打印events log信息

ps显示瞬间行程 (process) 的动态 

ps -AZ|grep -i init  查询init的属于的进程状态

android上层都是基于 init进程孵化而来

init进程中的log信息打印在kernel log 

可以通过 adb shell cat /proc/kmsg > kernel.log输出的kernel.log文件中搜索查看

由于默认klog内存比较小,从能连上adb导出log文件,基本上已经十来秒之后,故早期的一些log会被后续的log覆盖掉导致信息丢失。

在如下目录中

kernel-4.4/kernel/printk/printk.c

修改__LOG_BUF_LEN的值增加内存大小

 

//#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)

 

#define __LOG_BUF_LEN (4*1024 *1024)  log缓存变成4M

也可以在adb shell中通过dmesg | grep "xxx" 查看关键字观察所添加的log是否有输出。

另外还有android log的buffer  system/core/liblog/include/private/android_logger.h

#define LOG_BUFFER_SIZE (256 * 1024) 调整大小

 

system/core/liblog/include/private/android_logger.h

//#define LOG_BUFFER_SIZE (256 * 1024) /* Tuned with ro.logd.size per-platform \*/
change to

#define LOG_BUFFER_SIZE (4 * 1024 * 1024)

 

Android P 上init进程出现log无法打印的问题

<think>好的,用户现在想了解关于init的日志管理。首先,我需要确认用户的问题背景。他们可能是在开发或维护基于Linux的系统,比如Android,或者在使用嵌入式系统,因为init进程在这些环境中尤为重要。用户可能遇到了启动过程中的问题,需要查看日志来调试,或者他们想优化系统的启动流程。 接下来,我要回忆关于init进程的基本知识。init是系统启动的第一个进程,负责初始化系统服务和管理守护进程。它的日志管理对于系统调试和故障排除非常关键。用户可能想知道init如何记录日志,日志的位置,以及如何配置日志级别等。 然后,我需要考虑不同系统中init的实现可能不同。比如,传统的sysvinit、upstart,以及现在主流的systemd,还有Androidinit。用户的问题可能针对其中某一种,但如果没有具体说明,应该涵盖常见的几种情况,特别是Androidinit,因为之前的对话中提到了Android相关的内容。 对于systemd的日志管理,通常使用journalctl来查看日志,而传统sysvinit可能将日志放在/var/log/boot.logAndroidinit可能有自己的日志机制,比如通过logcat或者内核日志缓冲区。需要解释这些不同环境下的日志管理方法。 另外,用户可能关心如何配置日志的详细程度,比如如何启用调试日志,或者如何将日志重定向到特定文件。这些配置步骤需要详细说明,可能涉及修改init的配置文件,比如systemd的journald.conf,或者Androidinit.rc文件。 还要考虑用户可能的深层需求,比如他们是否在尝试诊断启动速度慢的问题,或者某个服务未能正常启动。这时候,查看init日志中的时间戳和服务启动顺序会很有帮助。需要提到如何分析日志中的关键事件和时间信息。 此外,安全性也是一个方面。日志可能包含敏感信息,如何确保日志的安全存储和访问权限也是需要注意的点。比如,在Android中,可能需要root权限才能访问某些日志,或者配置SElinux策略。 最后,应该提供一些实际的例子,比如使用journalctl命令查看启动日志,或者通过dmesg查看内核日志,以及在Android中使用logcat过滤init日志。这些具体的命令和步骤能帮助用户更好地理解和应用所学内容。 总结下来,回答需要涵盖不同init系统的日志管理方式、配置方法、日志位置、查看工具,以及实际应用案例,同时考虑用户可能的调试和优化需求,确保信息全面且实用。</think>在Linux系统(特别是Android/Linux嵌入式系统)中,**init进程的日志管理**是系统启动和运行时调试的核心环节。以下是分层解析: --- ### **核心架构** ```bash init进程日志流: 内核日志缓冲区 → init进程捕获 → 多路输出(控制台/文件/日志服务) → 持久化存储 ``` --- ### **关键日志类型** 1. **内核启动日志** - 来源:`printk()`输出的内核消息 - 查看方式: ```bash dmesg | grep "init:" # 或直接读取/proc/kmsg(需root权限) ``` 2. **init进程自身日志** - 来源:`init`代码中的`LOG()`宏 - 典型内容: ```log [ 1.234567] init: Processing action 'early-init' [ 1.567890] init: Starting service 'ueventd'... ``` 3. **服务启动日志** - 来源:通过`service`段定义的守护进程输出 - 重定向配置示例: ```rc service my_service /system/bin/my_daemon class main user root group root # 关键日志配置项 log_redirect # 启用日志重定向 loglevel 7 # 设置日志等级(0-7对应emerg-debug) console # 输出到控制台(可选) ``` --- ### **Android init日志管理机制** #### 1. **日志等级控制** 通过`loglevel`参数设置(位于`init.rc`或设备树配置): ```rc # 设置内核打印等级(0-7) loglevel 7 # 对应KERN_DEBUG级别 ``` #### 2. **多路输出配置** - **控制台输出**: ```rc # 在init.rc中配置 on early-init # 重定向控制台输出到串口 write /dev/console "init: early-init started\n" ``` - **文件持久化**: ```rc # 通过logwrapper工具重定向 service crash_logd /system/bin/logwrapper /system/bin/crash_daemon log_redirect log_file /data/logs/crash.log log_size 1M # 日志轮转设置 ``` #### 3. **日志缓冲区管理** - **内核环形缓冲区**: ```c // init源码中的处理逻辑 klog_init(); // 初始化内核日志捕获 klog_set_level(7); // 设置过滤级别 ``` - **Android特有扩展**: ```rc # 在init.rc中配置日志服务 service logd /system/bin/logd class core critical socket logd stream 0666 logd logd socket logdr seqpacket 0666 logd logd socket logdw dgram 0222 logd logd ``` --- ### **关键调试技巧** #### 1. **实时日志捕获 ```bash # 通过adb抓取Android init日志 adb shell "cat /proc/kmsg | grep 'init:'" # 使用logcat过滤init相关日志 adb logcat -s "init" ``` #### 2. **启动时序分析** 通过时间戳定位瓶颈: ```log [ 1.000000] init: init first stage started! [ 1.002000] init: Loading kernel modules... [ 1.500000] init: Waiting for /dev to be populated # 此处出现500ms延迟 ``` #### 3. **日志等级动态调整** 在运行时修改: ```bash # 设置内核日志等级(需root) echo 7 > /proc/sys/kernel/printk # Android专用调试命令 setprop persist.logd.filter DEBUG ``` --- ### **安全审计注意事项** 1. **敏感信息过滤** ```rc # 在service段添加日志过滤 service payment_service /vendor/bin/payment_daemon log_deny_pattern "user_cardnum=*" # 屏蔽银行卡号日志 ``` 2. **日志完整性保护** - 使用dm-verity对`/data/logs`分区进行完整性校验 - 配置SElinux策略限制日志访问: ```te # SEpolicy规则示例 allow init log_device:chr_file { read write }; ``` --- ### **性能优化实践** ```rc # init.rc中的高级配置 on boot # 启用异步日志写入 write /sys/module/printk/parameters/async_printk 1 # 调整内核日志缓冲区大小 write /proc/sys/kernel/printk_ringbuf 1M ``` --- ### **典型案例分析** **问题现象**: 设备启动卡在"Android"LOGO界面,无控制台输出 **调试步骤**: 1. 通过UART串口捕获早期日志: ```bash minicom -D /dev/ttyUSB0 -b 115200 ``` 2. 发现日志停滞在: ```log [ 2.345678] init: Waiting for /dev/block/mmcblk0p15 ``` 3. 定位到存储设备初始化超时,修复fstab中的分区挂载参数 --- 通过精细化的init日志管理,开发者可以快速定位从内核初始化到用户空间服务启动的全链路问题,是嵌入式系统调试的关键基础设施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值