现在的位置: 首页 > 综合 > 正文

修改内核简单定位段错误

2014年02月25日 ⁄ 综合 ⁄ 共 648字 ⁄ 字号 评论关闭

首先声明开发环境为MIPS Linux2.26 , AI32 应该也可以采用类似的方法。

一般而言,在我们打开 ulimited -c 1024 后,如果系统遇到段错误,应用程序会挂掉,并Dump出一个Core文件

我们可以通过gdb -c 调试Core文件

[vlient@localhost ~]$ gdb -c core.2714 

系统会把出错的地方和文件显示出来,结合addr2line可以直接 定位出问题的地方。

更彻底的方法:

通过研究内核对段错误的处理方法,我们可以让内核在出现段错误的时候,自己将出错的地方的地址打印处理。修改起来也很轻松,找到文件 fault.c 位于目录:linux-2.6.22/arch/mips/mm 。在函数do_page_fault()里面找到如下代码

#if 0
  printk("do_page_fault() #2: sending SIGSEGV to %s for "
         "invalid %s/n%0*lx (epc == %0*lx, ra == %0*lx)/n",
         tsk->comm,
         write ? "write access to" : "read access from",
         field, address,
         field, (unsigned long) regs->cp0_epc,
         field, (unsigned long) regs->regs[31]);
#endif

把#if o 改为 #if 1 ,就可以实现自己报错。很酷吧,Enjoy it!

 

抱歉!评论已关闭.