Kernel启动过程中被Stuck的调试

向自定义的开发板移植Kernel时,经常会遇到Kernel启动时卡住的问题,通常,由于无法获取足够的信息,调试比较费时。一般这种问题都出现在某个驱动初始化过程中,由于失败处理时的逻辑问题导致Kernel卡住,因此如果能够得到是哪个驱动初始化失败,就很容易定位问题。
####1. 方案:
Kernel中,选项KALLSYMS可以将Kernel代码中的符号信息编译到Image中,同时,如果在Command Line中,传入initcall_debug选项,则Kernel启动过程中,就会打印出如下的Log:

24 msecs [ 2.237177] initcall acpi_button_init+0x0/0x51 returned 0 
28 msecs [ 0.763503] initcall init_acpi_pm_clocksource+0x0/0x16c returned 0 
32 msecs [ 0.348241] initcall acpi_pci_link_init+0x0/0x43 returned 0 
33 msecs [ 0.919004] initcall inet_init+0x0/0x1c7 returned 0 
33 msecs [ 5.282722] initcall psmouse_init+0x0/0x5e returned 0 
54 msecs [ 2.979825] initcall e100_init_module+0x0/0x4d returned 0 
71 msecs [ 0.650325] initcall pnp_system_init+0x0/0xf returned 0 
91 msecs [ 0.872402] initcall pcibios_assign_resources+0x0/0x85 returned 0 
187 msecs [ 4.369187] initcall ehci_hcd_init+0x0/0x70 returned 0 
245 msecs [ 2.777161] initcall serial8250_init+0x0/0x100 returned 0 
673 msecs [ 5.098052] initcall uhci_hcd_init+0x0/0xc1 returned 0 
830 msecs [ 4.067279] initcall piix_init+0x0/0x27 returned 0 
1490 msecs [ 8.290606] initcall ip_auto_config+0x0/0xd70 returned 0

这样,如果驱动卡在了某个Init函数中,则很容易就能定位。
####2. 相关Config:
CONFIG_PRINTK_TIME & CONFIG_KALLSYMS,同时,由于Log数据量增加,可能需要加大printk的buffer大小,CONFIG_LOG_BUF_SHIFT 14->18。

Add:
还需要在bootargs中加入loglevel=9,确保debug信息能够输出。

你可能感兴趣的:(Linux,开源)