kernel启动console_init之前console不可用时发生crash的调试方法
http://code.google.com/p/innosoc/wiki/KernelBootCrashDebug
注:
如在i386_start_kernel中加入:early_printk("in i386_start_kernel\n"); console可以立即看到,不用等到console_init后
kernel启动控制台还不可用时发生crash的调试方法
在调试linux kernel时,如果crash发生在控制台还不可用时,那将没有任何信息能够被打印,那分析原因就变成了一摸黑。有以下方法有助于帮助分析:
1, early printk
在kernel配置选项中启用CONFIG_EARLY_PRINTK=y, 那将可借助early_printk()函数打印信息,用early_printk在kernel启动的代码中加入一些打印点,可以帮助定位kernel boot到哪一位置。
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 log_buf内存
printk函数打印的信息首先都是存在log_buf这块内存的,即使console还没enable,printk函数也一样可以被调用,因此当kernel crash时,可以通过仿真器查看log_buf 这段内存,它里面存的就是通过printk打印的信息,如果没有仿真器,也可以重启bootloader,在bootloader里通过dump mem来查看。
log_buf这段内存的地址如何确定?通过System.map文件搜索log_buf,你就会找到log_buf的地址,如:
c0535bd8 b printk_buf
c0535fd8 b printk_time
c0535fdc b __log_buf
c0539fdc b cpu_online_bits
c0539fe0 b cpu_active_bits
c0539fe4 b cpu_present_bits
c0539fe8 b cpu_possible_bits
c0539fec B sys_tz
c053a000 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启动console_init之前console不可用时发生crash的调试方法的更多相关文章
- 使用MethodSwizzle导致按home app进入后台或者app间切换发生crash的解决方法
参考文章: 1.http://blog.csdn.net/alincexiaohao/article/details/45913857 2.http://www.cocoachina.com/ios/ ...
- arm linux kernel启动之start_kernel
了解完kernel启动以前的汇编之后我们来看看正式的c语言启动代码,也就是我们的start_kernel函数了.start_kernel相当大,里面每一个调用到的函数都足够我们伤脑筋了,我这里只是浅尝 ...
- andriod and linux kernel启动流程
虽然这里的Arm Linux kernel前面加上了Android,但实际上还是和普遍Arm linux kernel启动的过程一样的,这里只是结合一下Android的Makefile,讲一下boot ...
- LINUX KERNEL启动参数
LINUX KERNEL启动参数 在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时 ...
- Linux kernel启动选项(参数)(转)
Linux kernel启动选项(参数) 转载链接https://www.cnblogs.com/linuxbo/p/4286227.html 在Linux中,给kernel传递参数以控制其行为总共 ...
- Linux kernel启动选项(参数)
在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB ...
- linux内核可以接受的参数 | Linux kernel启动参数 | 通过grub给内核传递参数
在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB ...
- Kernel启动时 驱动是如何加载的module_init,加载的次序如何;略见本文
Init.h中有相关initcall的启动次序,在system.map中可看出具体的__initcall指针的前后次序 #define pure_initcall(fn) __define_initc ...
- linux kernel启动流程
linux kernel启动是从./init/main.c中开始的,其大概流程是: 1. 调用start_kernel()函数: 2. start_kernel()调用rest_init()函数: 3 ...
随机推荐
- ssh架构简单解释和vo po解释
Struts.spring.Hibernate在各层的作用 1)struts 负责 web层. ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forwa ...
- C++之迭代器
迭代器的概念 迭代器是用来访问string对象或vector对象的元素的,类似于下标运算和指针. 其对象是容器中的元素或string对象中的字符: 使用迭代器可以访问某个元素,迭代器也能从一个元素移动 ...
- Icon Font浅谈
这周继续在弄hybird app 的 UI框架的重构,进行到了编写换肤功能的阶段,而在做换肤之前,我想应该先弄一套框架内置的图标. 而图标无非就是两种做法: 1.图片 使用图片很正常,但是有缺陷的. ...
- Sublime Text3 支持Less
1.安装Sublime 插件 (1)安装LESS插件:因为Sublime不支持Less语法高亮,所以,先安装这个插件,方法: ctrl+shift+p>install Package>输入 ...
- URL-统一资源定位器
URL - Uniform Resource Locator URL 可以由单词组成,比如 “w3school.com.cn”,或者是因特网协议(IP)地址:192.168.1.253.大多数人在网上 ...
- Swift tour
输出函数: print(“hello world!") 无需引入函数库,无须使用“;”作为语句结尾,也无须写跟其它语言一样的main()函数,Swift中,全局区的代码就是程序入口.You ...
- 【代码笔记】iOS-显示图片的各种方式
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UI ...
- 悟语 KISS 简单至上 keep it simple stupid
引自 PostgreSQL Server Programming-Second Edition page81: 大部分时候,我们不需要快速的代码,而是能用的程序. remember that most ...
- 表单form的enctype="multipart/form-data"使用疑惑
在使用表单传送数据的时候,如果form 加了enctype="multipart/form-data" 这个属性,那么表单请求传到另一个jsp或servlet 里时是不能用requ ...
- DROP_SNAPSHOT_RANGE过程不能清理表RM$_SNAPSHOT_DETAILS
今天在测试.验证DROP_SNAPSHOT_RANGE不能彻底快照的过程中遇到了DROP_SNAPSHOT_RANGE无法清理WRM$_SNAPSHOT_DETAILS表中数据的情况,测试服务器版本为 ...