2017-01-30 1 views
2

내 자식 프로세스가 PCI 주소 공간에 액세스하려고합니다. 대부분의 경우 잘 작동합니다.자식 프로세스가 SIGBUS 오류에 대해서만 코어를 생성하지 않고 좀비 프로세스가되었습니다.

하지만, 때로는 하위 프로세스가 좀비 상태가됩니다. dmesg logs는 다음 버스 오류를 표시합니다.

[ 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:/]$ 
+0

코드를 검사하여 읽기 실패 후 의도적으로/실수로 종료했는지 확인 중이라고 가정합니다. 부모가 아직 살아 있다고 가정하면 자식을 기다리고 종료 상태 및 반환 코드를 읽을 수 있습니까? – Ram

+0

상위 프로세스는 하위 프로세스를 시작하고 해당 PID를 기다리는 쉘 스크립트 파일입니다. –

+0

부모 프로세스는 하위의 SIGBUS 충돌을 인식하지 못하고 해당 PID를 계속 기다리고 있습니다. 자식 프로세스는 PCI 장치 레지스터 중 하나에서 읽기를 시도 할 때 SIGBUS를 가져옵니다. 나는이 자식 프로세스를 종료하지 않고 읽기 실패가 발생하자마자 좀비 상태로 간다. –

답변

0

나는 mmaped 된 PCI 하드웨어가 응답하지 않는다는 것을 알고 있습니다. 따라서 커널 만 오류를 처리하는 것이 적절합니다.

오류는 소프트웨어 오류가 아니기 때문에 사용자 수준으로 전파되지 않습니다. 따라서 우리는 소프트웨어 훼손이 아니기 때문에 코어 덤프 (커널 또는 사용자 공간)를 얻지 못합니다.

커널의 기계 검사 예외 처리기는 하드웨어 오류가 무엇인지, 그리고 어떤 주소/데이터와 관련이 있는지 (원인에 따라 다름) 알려줍니다. 하드웨어 관점에서 조사해야합니다.

관련 문제