您的位置:首页 > 运维架构 > Linux

linux之如何定位难重现的内核飞掉的问题

2016-10-11 23:22 369 查看
     本人曾参与过一个大型交换机设备的开发,平台是基于linux内核态的开发,而所用芯片的SDK又号称不再支持内核态。导致调试时经常偶然性就飞掉。调度栈显示都莫名其妙。

  这种一般就是内核栈空间被用光了,如果不是栈空间用光,(内存越界等问题)其oop相应显示还是会比较正常。

     问题解决思路,既然是怀疑是内核栈空间被用光了,我们就先查查相应代码谁用了大的栈空间呗?

     有的人可能直接说咱看代码吧,谁用了大的临时变量等一看不就好了么。不好意思,大学生里的小代码量你这样做可以。一般项目里的代码你一辈子都看不清也看不透所有的代码的临时变量。而且嵌套了函数调用,涉及到编译优化的问题,再你看来简单的临时变量的函数有可能占用很大的栈空间。

     1第一步是将软件包的KO直接反汇编。:objdump -s *.ko > 1.txt

      2.用正则表达式直接把stwa 数据大于500的那前后几行过滤出来输出到文件2.txt

      3.然后再用相关命令将2.txt的行排序

    4从大到小去解决相应的函数的临时变量,大的临时变量改成内存申请或者静态变量的方式。注意内存申请的方式要注意内存的释放。

    note:编译器编译的时候经常会把static函数直接当做代码块变异到调用函数里,可能导致调用函数的临时变量特别大。这也是要注意的一点,如果一个函数调用了很多静态函数,要注意此类的问题。

    最好的解决方法,还是跑在用户态吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: