嵌入式开发中路由器内核崩溃调试技巧

  最近开发的项目中由于偶尔会出现概率性的SIGSEGV (段错误),一直找不到方法来解决这个问题,直到最近才知道可以使用Core Dump功能来跟踪反推出问题的源码位置。由于网上关于core dump的知识很多这里不详述。

  在我们的嵌入式开发中出现内核崩溃导致死机的问题大致有以下几个原因

  1. 内存访问越界 (数组越界、字符串无\n结束符、字符串读写越界)
  2. 多线程程序中使用了线程不安全的函数,如不可重入函数
  3. 多线程读写的数据未加锁保护(临界区资源需要互斥访问)
  4. 非法指针(如空指针异常或者非法地址访问)
  5. 堆栈溢出

     嵌入式开发凡是出现关于指针类的问题的都不太好找出问题和解决,这里给出的一种方法是使用嵌入式生成固件的目录下的.elf二进制文件反推出汇编代码,然后通过系统死机的log,找出log中出现死机的地址

再去.elf生成的汇编文件中找出上述的地址,就能大致定位出导致内核崩溃的函数。

 

步骤一:在生成系统固件的地方找到.elf文件,我这里是vmlinux.elf,你有没有.elf文件要确保自己系统有没有自带Core Dump功能(这里网上很多,不详述)

 步骤二:查看自己的交叉工具链

    

 步骤三:将vmlinux.elf文件复制到交叉工具链的bin目录下(最好在linux下cp,在window下直接剪切的文件可能会不能运行)

步骤四:进入交叉工具链的bin目录下并将vmlinux.elf反汇编

    

      生成的ji.txt就是反汇编结果,通过这些反汇编信息,可以找到内核崩溃下的log的对应,并通过找出周边的函数,可以极大的缩小内核崩溃范围的搜索

 

 

注意:生成的汇编文件一般比较大,还有使用这个方法前最好将系统的固件升级到与执行的.elf文件版本一致,不然会有可能出现段错误的地址与实际的固件对应不上的情况。

 

posted @ 2017-11-15 17:10  光的背影  阅读(323)  评论(0)    收藏  举报