initcall_debug来查看开机慢问题

本文介绍如何在Linux内核中启用initcall_debug功能,通过在cmdline中添加参数,可以在启动日志中获取到每个初始化函数的执行时间和返回值,有助于诊断系统启动过程中的问题。同时,通过调整loglevel参数,可以将更多日志输出到串口,便于问题定位。文章还提供了一种解析initcall日志的方法,帮助开发者快速找到耗时较长的初始化过程。

1.cmdline中传入initcall_debug

对于android开发环境来说,可以在device中的BoardConfig.mk中添加如下:


BOARD_KERNEL_CMDLINE += initcal_debug

对于linux系统,可以在defconfig中添加:


CONFIG_CMDLINE="initcall_debug"

当然这种方式同样适用于android设备。

当我们使用上面的配置重新编译了boot.img之后烧入系统,会发现在dmesg打印的启动阶段的log中有如下风格的打印:



 [    4.746509] initcall phy_init+0x0/0x6c returned 0 after 186 usecs

 [    4.763443] initcall usb_init+0x0/0x17c returned 0 after 16525 usecs

 [    4.763483] initcall dual_role_class_init+0x0/0x8c returned 0 after 27 usecs

 [    4.774618] initcall usb_phy_generic_init+0x0/0x24 returned 0 after 10861 usecs

 [    4.774662] initcall usb_udc_init+0x0/0x70 returned 0 after 31 usecs

 [    4.774741] initcall serio_init+0x0/0x44 returned 0 after 65 usecs

 [    4.774800] initcall input_init+0x0/0x110 returned 0 after 45 usecs

 [    4.775528] initcall qpnp_pon_init+0x0/0x24 returned 0 after 698 usecs

 [    4.775575] initcall rtc_init+0x0/0x6c returned 0 after 34 usecs

 [    4.776189] initcall i2c_gpio_init+0x0/0x48 returned 0 after 587 usecs

 [    4.780986] initcall media_devnode_init+0x0/0x98 returned 0 after 4672 usecs

 [    4.785784] initcall videodev_init+0x0/0x9c returned 0 after 4673 usecs

 [    4.785842] initcall init_dvbdev+0x0/0xf4 returned 0 after 43 usecs

 [    4.785906] initcall rc_core_init+0x0/0x6c returned 0 after 51 usecs

 [    4.785953] initcall power_supply_class_init+0x0/0x58 returned 0 after 33 usecs

 [    4.785993] initcall hwmon_init+0x0/0x48 returned 0 after 27 usecs

 [    4.817853] initcall thermal_init+0x0/0x140 returned 0 after 31094 usecs

 [    4.844966] initcall tsens_tm_init_driver+0x0/0x24 returned 0 after 26456 usecs

2.使能loglevel

当我们使能initcall_debug功能之后发现,这个log并没有默认输出到串口中,对于那些系统启动过程就卡死的问题,我们很难看到对应的log来定位问题,所以我们可以考虑把loglevel默认打印级别调高,比如在cmdline中设置loglevel=8,这样就会默认把所有log输出到串口了。方法如下:

对于android开发环境来说,可以在device中的BoardConfig.mk中添加如下:


BOARD_KERNEL_CMDLINE += initcal_debug loglevel=8

对于linux系统,可以在defconfig中添加:


CONFIG_CMDLINE="initcall_debug loglevel=8"

3.解析initcall debug log


cat log.txt | grep "initcall" | sed "s/\(.*\)after\(.*\)/\2 \1/g" | sort -n

这个命令可以解析log中的initcall数据,并根据时间长短进行排序,结果如下:


 27 usecs  [    4.763483] initcall dual_role_class_init+0x0/0x8c returned 0 

 27 usecs  [    4.785993] initcall hwmon_init+0x0/0x48 returned 0 

 31 usecs  [    4.774662] initcall usb_udc_init+0x0/0x70 returned 0 

 33 usecs  [    4.785953] initcall power_supply_class_init+0x0/0x58 returned 0 

 34 usecs  [    4.775575] initcall rtc_init+0x0/0x6c returned 0 

 43 usecs  [    4.785842] initcall init_dvbdev+0x0/0xf4 returned 0 

 45 usecs  [    4.774800] initcall input_init+0x0/0x110 returned 0 

 51 usecs  [    4.785906] initcall rc_core_init+0x0/0x6c returned 0 

 65 usecs  [    4.774741] initcall serio_init+0x0/0x44 returned 0 

 186 usecs  [    4.746509] initcall phy_init+0x0/0x6c returned 0 

 587 usecs  [    4.776189] initcall i2c_gpio_init+0x0/0x48 returned 0 

 698 usecs  [    4.775528] initcall qpnp_pon_init+0x0/0x24 returned 0 

 4672 usecs  [    4.780986] initcall media_devnode_init+0x0/0x98 returned 0 

 4673 usecs  [    4.785784] initcall videodev_init+0x0/0x9c returned 0 

 10861 usecs  [    4.774618] initcall usb_phy_generic_init+0x0/0x24 returned 0 

 16525 usecs  [    4.763443] initcall usb_init+0x0/0x17c returned 0 

 26456 usecs  [    4.844966] initcall tsens_tm_init_driver+0x0/0x24 returned 0 

 31094 usecs  [    4.817853] initcall thermal_init+0x0/0x140 returned 0 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值