免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: zhaochongzq
打印 上一主题 下一主题

[网络子系统] Kernel panic - not syncing: Attempted to kill init! [复制链接]

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
11 [报告]
发表于 2016-03-16 11:47 |只看该作者
“测试路由器WAN口连接方式和连接5G的SSID”
这个任务是由1号进程自己来做么?没有fork子进程?

论坛徽章:
0
12 [报告]
发表于 2016-03-16 13:34 |只看该作者
回复 11# nswcfd

我们这边的软件组织架构比较蛋疼,一般都是webserver接收到用户配置信息,然后发送信号通知init进程,然后init进程再去调用相关的函数或者通过system调用其它进程。所以如果init进程错误退出,系统就挂了。
   

论坛徽章:
0
13 [报告]
发表于 2016-03-16 13:37 |只看该作者
回复 8# Tinnal

是啊,就是什么多余的信息都没有才不知道该从哪儿入手。
   

论坛徽章:
0
14 [报告]
发表于 2016-03-16 13:38 |只看该作者
回复 9# zhayun604863141

好的,我编个软件测试一下,看bug复现时能不能多点提示信息。
   

论坛徽章:
0
15 [报告]
发表于 2016-03-18 09:40 |只看该作者
回复 9# zhayun604863141

(04:07:36)Bus einit/1: potentially unexpected fatal signal 11.
(04:07:36)rr
(04:07:36)orCpu 0
(04:07:36)
(04:07:37)$ 0   : 00000000 00000001 004a6008 2e65682f
(04:07:37)$ 4   : 2ae66500 00000002 00000048 2ae6b164
(04:07:37)$ 8   : 00000000 00000000 800b45a0 fffffff8
(04:07:37)$12   : 00000000 00000000 0000007e 00000000
(04:07:37)$16   : 004a5fd0 00000049 2ae6b100 00000007
(04:07:37)$20   : 00010021 00000001 00000038 2ad8e3e8
(04:07:37)$24   : 00000000 2adf5898                  
(04:07:37)$28   : 2ae6e520 7f9cd9b0 7f9ceb48 2ae14150
(04:07:37)Hi    : 00000005
(04:07:37)Lo    : 70a3d70f
(04:07:37)epc   : 2ae14240 0x2ae14240
(04:07:37)    Not tainted
(04:07:37)ra    : 2ae14150 0x2ae14150
(04:07:37)Status: 0100ff13    USER EXL IE
(04:07:37)Cause : 4080000c
(04:07:37)BadVA : 00000050
(04:07:37)PrId  : 00019650 (MIPS 24Kc)
(04:07:37)Kernel panic - not syncing: Attempted to kill init!
(04:07:37)Call Trace:
(04:07:37)[<8001a508>] dump_stack+0x8/0x34
(04:07:37)[<8003b678>] panic+0x88/0x1cc
(04:07:37)[<8003f184>] do_exit+0x484/0x688
(04:07:37)[<8003f40c>] do_group_exit+0x4c/0xb4
(04:07:37)[<8004c3fc>] get_signal_to_deliver+0x2c0/0x3d8
(04:07:37)[<800196e8>] do_notify_resume+0x124/0x460
(04:07:37)[<80008568>] work_notifysig+0xc/0x14

从log信息看,init进程出现了段错误,是不是可以确定是init进程访问了非法内存地址,导致内核kill掉了init,然后卡死。
   

论坛徽章:
1
金牛座
日期:2014-08-18 17:32:41
16 [报告]
发表于 2016-03-24 09:31 |只看该作者
potentially unexpected fatal signal 11.

11是SIGSEGV,检查每一个使用指针,访问数组地址之类的地方

论坛徽章:
0
17 [报告]
发表于 2016-03-24 22:06 |只看该作者
回复 15# zhaochongzq
是的,空指针BadVA : 00000050,      epc   : 2ae14240应该就是空指针被引用的地方,反汇编查查epc 、ra对应的2ae14240 2ae14150 位于何处?


   

论坛徽章:
0
18 [报告]
发表于 2016-03-28 14:52 |只看该作者
回复 17# zhayun604863141


用objdump反汇编出来的代码找不到该地址。

论坛徽章:
0
19 [报告]
发表于 2016-03-30 23:03 |只看该作者
回复 18# zhaochongzq
sorry,找不到应该是因为这两个地址都在库文件里面, 你可以在问题出现问题前任意时间,打印下init的maps,然后确认是在哪个库文件的哪个函数。

不过以上,你只能找到是挂在库文件的哪个函数,但是init中可能有多处调用该函数,比如可能是strcpy,也有可能是间接调用该函数。所以需要打印出init挂掉时的calltrace,MIPS的,你可以参照百度搜一下“基于MIPS架构的BackTrace实现”,参照实现一个。

我没有权限发链接,不过网上有很多。



   

论坛徽章:
0
20 [报告]
发表于 2016-03-30 23:12 |只看该作者
回复 19# zhayun604863141

找打一个现成的了,在init中注册该信号函数试试,看能否在挂的是否打印出调用栈。 实现原理参照百度搜索“基于MIPS架构的BackTrace实现”

如果不行的话,将其提前到内核中捕捉异常信息时打印,移到内核时,访问用户内存时,注意下使用get_user。
  1. #include <stdio.h>      
  2. #include <string.h>     
  3. #include <stdlib.h>     
  4. #include <signal.h>     
  5. #include <ucontext.h>   
  6.       
  7. #define abs(s) ((s) < 0 ? -(s) : (s))  
  8.       
  9. #define CALL_TRACE_MAX_SIZE             (10)  
  10.       
  11. #define MIPS_ADDIU_SP_SP_XXXX           (0x27bd0000) /* instruction code for addiu sp, sp, xxxx */  
  12. #define MIPS_SW_RA_XXXX_SP              (0xafbf0000) /* instruction code for sw ra, xxxx(sp) */  
  13. #define MIPS_ADDU_RA_ZERO_ZERO          (0x0000f821) /* instruction code for addu ra, zero, zero */

  14. void getCodeIn(unsigned long codeAddr, char *pCodeIn, int iCodeInSize, unsigned long *pOffset)                                 
  15. {     
  16.     FILE *pFile = NULL;
  17.     char szLine[1000] = {0};

  18.     pFile = fopen("/proc/self/maps", "r");  
  19.     if ( pFile != NULL )
  20.     {
  21.         while (fgets(szLine, sizeof(szLine), pFile))
  22.         {     
  23.             char *pTmp = NULL;      
  24.             char szAddr[500] = {0};  
  25.             char szCodeIn[500] = {0};
  26.             unsigned long begin = 0;
  27.             unsigned long end = 0;   

  28.             sscanf(szLine, "%s %*s %*s %*s %*s %s", szAddr, szCodeIn);

  29.             pTmp = strchr(szAddr, '-');
  30.             if ( pTmp != NULL )
  31.             {
  32.                 *pTmp++ = '\0';
  33.                 begin = strtoul(szAddr, NULL, 16);        
  34.                 end = strtoul(pTmp, NULL, 16);        
  35.             }

  36.             if ( codeAddr >= begin && codeAddr <= end )
  37.             {
  38.                 strncpy(pCodeIn, szCodeIn, iCodeInSize);
  39.                 *pOffset = codeAddr - begin;
  40.                 return;
  41.             }
  42.         }

  43.         fclose(pFile);
  44.     }   

  45.     strncpy(pCodeIn, "unknown", iCodeInSize);
  46.     *pOffset = 0;
  47. }

  48. int backtrace_mips32(void **buffer, int size, ucontext_t *uc)  
  49. {        
  50.     unsigned long *tmpl = NULL;  
  51.     unsigned long *addr = NULL;  
  52.     unsigned long *ra = NULL;  
  53.     unsigned long *sp = NULL;  
  54.     unsigned long *pc = NULL;  
  55.     size_t         ra_offset = 0;  
  56.     size_t         stack_size = 0;  
  57.     int            depth = 0;  

  58.     if (size == 0)  
  59.     {   
  60.         return 0;   
  61.     }   

  62.     if (buffer == NULL || size < 0 || uc == NULL)                                                                              
  63.     {   
  64.         return -1;   
  65.     }   

  66.     pc = (unsigned long *)(unsigned long)uc->uc_mcontext.pc;   
  67.     ra = (unsigned long *)(unsigned long)uc->uc_mcontext.gregs[31];   
  68.     sp = (unsigned long *)(unsigned long)uc->uc_mcontext.gregs[29];

  69.     buffer[0] = pc;

  70.     if ( size == 1 )  
  71.     {  
  72.         return 1;   
  73.     }

  74.     for ( addr = pc; !ra_offset || !stack_size; --addr )  
  75.     {  
  76.         if ( ((*addr) & 0xffff0000) == MIPS_SW_RA_XXXX_SP)  
  77.         {  
  78.             ra_offset = (short)((*addr) & 0xffff);   
  79.         }  
  80.         else if ( ((*addr) & 0xffff0000) == MIPS_ADDIU_SP_SP_XXXX)  
  81.         {  
  82.             stack_size = abs((short)((*addr) & 0xffff));  
  83.         }  
  84.         else if ( (*addr) == MIPS_ADDU_RA_ZERO_ZERO )  
  85.         {  
  86.             return 1;   
  87.         }  
  88.     }

  89.     if ( ra_offset > 0 )  
  90.     {  
  91.         tmpl = (unsigned long *)((char *)sp + ra_offset);  
  92.         ra = (unsigned long *)(*tmpl);  
  93.     }  

  94.     if ( stack_size > 0 )   
  95.     {  
  96.         sp = (unsigned long *)((unsigned long)sp + stack_size);  
  97.     }  


  98.     for (depth = 1; depth < size && ra; ++depth)  
  99.     {  
  100.         buffer[depth] = ra;  



  101.         ra_offset = 0;  
  102.         stack_size = 0;

  103.         for (addr = ra; !ra_offset || !stack_size; --addr)
  104.         {   
  105.             if ( ((*addr) & 0xffff0000) == MIPS_SW_RA_XXXX_SP)
  106.             {
  107.                 ra_offset = (short)((*addr) & 0xffff);
  108.             }
  109.             else if ( ((*addr) & 0xffff0000) == MIPS_ADDIU_SP_SP_XXXX)  
  110.             {
  111.                 stack_size = abs((short)((*addr) & 0xffff));
  112.             }
  113.             else if ( (*addr) == MIPS_ADDU_RA_ZERO_ZERO )
  114.             {
  115.                 return depth + 1;
  116.             }
  117.         }   

  118.         tmpl = (unsigned long *)((char *)sp + ra_offset);
  119.         ra = (unsigned long *)(*tmpl);
  120.         sp = (unsigned long *)((unsigned long)sp + stack_size);
  121.     }

  122.     return depth;
  123. }

  124. void signal_process(int sig_no, siginfo_t *sig_info, void *ucontext)     
  125. {                                                                       
  126.     int i = 0;                                                           
  127.     unsigned long *callStack[CALL_TRACE_MAX_SIZE] = {0};               

  128.     printf("\r\n*******************************************\r\n");      

  129.     printf("recv signo %d\r\n", sig_no);                       

  130.     backtrace_mips32((void **)callStack, CALL_TRACE_MAX_SIZE, (ucontext_t *)ucontext);  

  131.     printf("\r\ncall tracing:\r\n");                           
  132.     for ( i = 0; i < CALL_TRACE_MAX_SIZE; i++ )               
  133.     {         
  134.         char szCodeIn[100] = {0};
  135.         unsigned long addrOffset = 0;                          

  136.         if ( callStack[i] == 0 )                              
  137.         {                             
  138.             break;                  
  139.         }     

  140.         getCodeIn((unsigned long)callStack[i], szCodeIn, sizeof(szCodeIn), &addrOffset);

  141.         printf("\t[%02d] addr 0x%08x(offset 0x%08x), in %s\r\n", i, callStack[i], addrOffset, szCodeIn);   
  142.     }                                

  143.     printf("*******************************************\r\n");  

  144.     if (sig_no == SIGSEGV)           
  145.     {                                 
  146.         signal(sig_no, SIG_DFL);     
  147.     }   

  148.     sleep(3);                        
  149. }

  150. void c(void)                    
  151. {                                       
  152.     int *p = 0;                        
  153.     printf("I am function [c]\r\n");   
  154.     *p = 888;
  155. }  

  156. void b(void)
  157. {   
  158.     printf("I am function [b]\r\n");
  159.     c();
  160. }   

  161. void a(void)
  162. {   
  163.     printf("I am function [a]\r\n");
  164.     b();
  165. }


  166. int main(int argc, char *argv[])
  167. {   
  168.     struct sigaction act = {0};

  169.     act.sa_sigaction = signal_process;
  170.     sigemptyset(&act.sa_mask);
  171.     act.sa_flags = SA_SIGINFO;

  172.     sigaction(SIGSEGV, &act, NULL);

  173.     printf("I am function [main]\r\n");

  174.     a();

  175.     return 0;
  176. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP