Syslogd内核:代码:

时间:2011-06-21 01:32:30

标签: crash linux-kernel fedora

在运行一些与MySQL服务器交互的实验性Java代码时,我收到了这些消息,然后服务器崩溃了:

Message from syslogd@localhost at Jun 20 20:04:12 ...
 kernel:Stack:

Message from syslogd@localhost at Jun 20 20:04:12 ...
 kernel:Call Trace:

Message from syslogd@localhost at Jun 20 20:04:12 ...
 kernel:Code: e0 48 8d 55 b0 48 89 4d e8 4c 89 45 f0 48 89 45 b8 48 8d 45 d0 4c 89 4d f8 c7 45 b0 10 00 00 00 48 89 45 c0 e8 5a ff ff ff c9 c3 <89> f0 b9 40 00 00 00 55 99 45 31 c0 f7 f9 48 89 e5 48 89 fa 41 

他们是什么意思?重启后,一切正常。 / var / log / messages在事件发生时没有条目,dmesg似乎也没有显示任何内容。

Fedora第13版(戈达德) 2.6.34.8-68.fc13.x86_64

1 个答案:

答案 0 :(得分:2)

这是转储代码的反汇编,如果有帮助的话。我假设尖括号包围的字节是代码崩溃的地方,虽然我看不出从一个寄存器到另一个寄存器的mov语句是如何做的。

   0:   e0 48                   loopne 0x4a
   2:   8d 55 b0                lea    -0x50(%ebp),%edx
   5:   48                      dec    %eax
   6:   89 4d e8                mov    %ecx,-0x18(%ebp)
   9:   4c                      dec    %esp
   a:   89 45 f0                mov    %eax,-0x10(%ebp)
   d:   48                      dec    %eax
   e:   89 45 b8                mov    %eax,-0x48(%ebp)
  11:   48                      dec    %eax
  12:   8d 45 d0                lea    -0x30(%ebp),%eax
  15:   4c                      dec    %esp
  16:   89 4d f8                mov    %ecx,-0x8(%ebp)
  19:   c7 45 b0 10 00 00 00    movl   $0x10,-0x50(%ebp)
  20:   48                      dec    %eax
  21:   89 45 c0                mov    %eax,-0x40(%ebp)
  24:   e8 5a ff ff ff          call   0xffffff83
  29:   c9                      leave  
  2a:   c3                      ret    
  2b:   89 f0                   mov    %esi,%eax   <-- here is where it failed?
  2d:   b9 40 00 00 00          mov    $0x40,%ecx
  32:   55                      push   %ebp
  33:   99                      cltd   
  34:   45                      inc    %ebp
  35:   31 c0                   xor    %eax,%eax
  37:   f7 f9                   idiv   %ecx
  39:   48                      dec    %eax
  3a:   89 e5                   mov    %esp,%ebp
  3c:   48                      dec    %eax
  3d:   89 fa                   mov    %edi,%edx
  3f:   41                      inc    %ecx

<小时/> 我不知道如何使用任何* grep程序来搜索二进制数据,因此您可能需要编写几行perl或python来查找所涉及的内核代码。您的Java代码或与MySQL有关的任何内容都可能导致内核级崩溃,这是非常值得怀疑的。

<小时/> 更正了64位模式的反汇编:

00000000 <.data>:
   0:   e0 48                   loopne 0x4a
   2:   8d 55 b0                lea    -0x50(%rbp),%edx
   5:   48 89 4d e8             mov    %rcx,-0x18(%rbp)
   9:   4c 89 45 f0             mov    %r8,-0x10(%rbp)
   d:   48 89 45 b8             mov    %rax,-0x48(%rbp)
  11:   48 8d 45 d0             lea    -0x30(%rbp),%rax
  15:   4c 89 4d f8             mov    %r9,-0x8(%rbp)
  19:   c7 45 b0 10 00 00 00    movl   $0x10,-0x50(%rbp)
  20:   48 89 45 c0             mov    %rax,-0x40(%rbp)
  24:   e8 5a ff ff ff          callq  0xffffff83
  29:   c9                      leaveq 
  2a:   c3                      retq   
  2b:   89 f0                   mov    %esi,%eax
  2d:   b9 40 00 00 00          mov    $0x40,%ecx
  32:   55                      push   %rbp
  33:   99                      cltd   
  34:   45 31 c0                xor    %r8d,%r8d
  37:   f7 f9                   idiv   %ecx
  39:   48 89 e5                mov    %rsp,%rbp
  3c:   48 89 fa                mov    %rdi,%rdx
  3f:   41                      rex.B

[经过这么多年后再次看到这个,我意识到问题更可能是:堆栈下溢。 retq没有地方可以返回,因为堆栈是空的,所以指令指针指向下面的指令 - jc]