kernel启动控制台还不可用时发生cr…
来源:互联网 发布:centos7 git 源码安装 编辑:程序博客网 时间:2024/05/26 07:30
kernel启动控制台还不可用时发生crash的调试方法
在调试linuxkernel时,如果crash发生在控制台还不可用时,那将没有任何信息能够被打印,那分析原因就变成了一摸黑。有以下方法有助于帮助分析:
1,early printk
在kernel配置选项中启用CONFIG_EARLY_PRINTK=y,那将可借助early_printk()函数打印信息,用early_printk在kernel启动的代码中加入一些打印点,可以帮助定位kernelboot到哪一位置。
early_printk的配置选项位于Kernel hacking,还必须开启了CONFIG_DEBUG_LL=y,才能启用early printk.
Kernel hacking ----> [*] Kernel low-level debugging functions [*] Early printk
这一功能,需要你的arch实现底层的uart发送函数, 即include/mach/debug-macro.S中的addruart,senduart, waituart, busyuart等函数。
2,dump
printk函数打印的信息首先都是存在log_buf这块内存的,即使console还没enable,printk函数也一样可以被调用,因此当kernelcrash时,可以通过仿真器查看log_buf这段内存,它里面存的就是通过printk打印的信息,如果没有仿真器,也可以重启bootloader,在bootloader里通过dumpmem来查看。
log_buf这段内存的地址如何确定?通过System.map文件搜索log_buf,你就会找到log_buf的地址,如:
c0535bd8 b printk_bufc0535fd8 b printk_timec0535fdc b __log_bufc0539fdc b cpu_online_bitsc0539fe0 b cpu_active_bitsc0539fe4 b cpu_present_bitsc0539fe8 b cpu_possible_bitsc0539fec B sys_tzc053a000 b softirq_vec
这里我们看到log_buf的内存地址在c0535fdc,这是个虚拟地址,根据kernel地址映射规律,从MEM_PHY_START到MEM_PHY_END,都会一一映射到0xc0000000:(0xc0000000 +MEM_PHY_SIZE),因此假设我们内存的物理地址起始是0x0,那么这里log_buf的实际物理地址为0x00535fdc。
在确认完log_buf的内存地址之后,就可以用仿真器也好,bootloader也好,去查看printk打印的内容了。
- kernel启动控制台还不可用时发生cr…
- kernel启动控制台还不可用时发生cr…
- kernel启动控制台还不可用时发生crash的调试方法
- kernel启动控制台还不可用时发生crash的调试方法
- 客户端cookie不可用时,解决方案
- 还在爬山吗?得知恨晚!长时间爬山导致人体发生的变化,不可不看
- intent 系统应用时 发生ACTIVITYNOTFOUNDEXCEPTION
- Button不可用时颜色为灰色
- websphere 7.0 控制台中的企业服务启动失败 ( 尝试处理服务器 server1 时发生异常 )
- cr
- cr
- 数据库连接泄漏还在发生
- android kernel控制台初始化过程
- android kernel控制台初始化过程
- 当出现Magento搜索功能不可用时的处理
- mfc关于CButtonST按钮设置不可用时,按钮变灰
- 关于CButtonST按钮设置不可用时设置按钮图标
- 当DBCA删除数据库不可用时,手工删除数据库
- android USB绑定功能实现(fr…
- linux bring up串口何时初始化
- Linux __setup解析
- Linux __setup解析
- kernel启动控制台还不可用时发生cr…
- kernel启动控制台还不可用时发生cr…
- Redis内部数据结构详解之压缩链表(ziplist)
- start_kernel()之prink()
- start_kernel()之prink()
- 关于printk的分析
- 关于printk的分析
- Linux启动参数及实现 __setup…
- Linux启动参数及实现 __setup…
- Linux内核的early_param原理追踪