【问题标题】:Child process is not generating core ONLY for SIGBUS error and became Zombie process子进程不会仅为 SIGBUS 错误生成核心并成为僵尸进程
【发布时间】:2017-06-15 11:37:51
【问题描述】:

我的子进程正在尝试访问 PCI 地址空间。它在大多数情况下都能正常工作。

但是,有时子进程会进入僵尸状态。 dmesg 日志显示以下总线错误。

[  501.134156] Caused by (from MCSR=10008): Bus - Read Data Bus Error
[  501.134169] Oops: Machine check, sig: 7 [#1]

本例没有生成核心文件。

[Linux:/]$ ps -axl | grep tes1
4     0  6805 32495  20   0      0     0 exit   Zl   ?  0:05 [test1] <defunct>
[Linux:/]$ 

子进程为 SIGSEGV 错误生成核心。所以我认为它与权限/ulimit设置无关。

有人可以帮我理解为什么在这种情况下没有生成核心吗?

Child Process:
--------------

[Linux:/]$ cat /proc/6805/status
Name:   test1
State:  Z (zombie)
Tgid:   6805
Pid:    6805
PPid:   32495
TracerPid:  0
Uid:    0   0   0   0
Gid:    0   0   0   0
FDSize: 0
Groups: 
Threads:    2
SigQ:   18/13007
SigPnd: 0000000002000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001006
SigCgt: 0000000182000200
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
Seccomp:    0
Cpus_allowed:   3
Cpus_allowed_list:  0-1
voluntary_ctxt_switches:    8998
nonvoluntary_ctxt_switches: 857

   Stack:
   -------

[Linux:/]$ cat /proc/6805/stack
[<00000000>]    (nil)
[<c0008640>] __switch_to+0xc0/0x160
[<c004b4f4>] do_exit+0x5d4/0xa70
[<c000c694>] die+0x224/0x310
[<c000ce44>] machine_check_exception+0x124/0x1e0
[<c00123bc>] ret_from_mcheck_exc+0x0/0x14c
[Linux:/]$ 


Parent Process:
---------------
[Linux:/]$ cat /proc/32495/status
Name:   test
State:  S (sleeping)
Tgid:   32495
Pid:    32495
PPid:   21911
TracerPid:  0
Uid:    0   0   0   0
Gid:    0   0   0   0
FDSize: 256
Groups: 
VmPeak:     4820 kB
VmSize:     4820 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:      2548 kB
VmRSS:      2548 kB
VmData:     1284 kB
VmStk:       132 kB
VmExe:       900 kB
VmLib:      1976 kB
VmPTE:        24 kB
VmSwap:        0 kB
Threads:    1
SigQ:   19/13007
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000001006
SigCgt: 0000000043816ef9
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
Seccomp:    0
Cpus_allowed:   3
Cpus_allowed_list:  0-1
voluntary_ctxt_switches:    274
nonvoluntary_ctxt_switches: 145
[Linux:/]$ 

【问题讨论】:

  • 我假设您已经检查了您的代码以查看您是否在读取失败后有意/无意地退出。假设父母还活着,你能等到孩子,然后读取退出状态和返回码吗?
  • 父进程是一个shell脚本文件,它启动子进程并等待它的PID。
  • 父进程不知道子进程的 SIGBUS 崩溃并仍在等待其 PID。子进程在尝试读取 PCI 设备寄存器之一时获得 SIGBUS。我没有退出这个子进程,一旦发生读取失败,它就会进入僵尸状态。
  • 我了解映射到该地址的 PCI 硬件没有响应。因此,内核(并且只有内核)处理它们是合适的。它们不会传播到用户级别,因为它们不是软件故障。我们没有得到核心转储(内核或用户空间),因为它不是软件故障。

标签: linux core child-process pci-bus sigbus


【解决方案1】:

我了解映射的 PCI 硬件没有响应。所以,只有内核来处理错误是合适的。

错误不会传播到用户级别,因为这不是软件故障。因此,我们没有得到核心转储(内核或用户空间),因为它不是软件故障。

内核中的机器检查异常处理程序告诉硬件故障是什么,以及哪些地址/数据是相关的(取决于原因) - 需要从硬件角度进一步调查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2017-10-16
    • 2014-04-25
    相关资源
    最近更新 更多