2017-01-30 1 views
2

Mein Kindprozess versucht, auf einen PCI-Adressraum zuzugreifen. Es funktioniert die meiste Zeit gut.Kindprozess generiert NUR Kern für SIGBUS-Fehler und wurde Zombie-Prozess

Aber manchmal geht der Kinderprozess in den Zombie-Zustand. dmesg-Protokolle zeigen den folgenden Busfehler an.

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

In diesem Fall wird keine Core-Datei generiert.

Core wird für SIGSEGV-Fehler vom untergeordneten Prozess generiert. Also nehme ich an, dass es nichts mit den Berechtigungen/ulimit-Einstellungen zu tun hat.

Kann mir jemand helfen zu verstehen, warum Core in diesem Fall nicht generiert wird?

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

Ich gehe davon aus, dass Sie Ihren Code überprüft haben, um zu sehen, ob Sie nach einem Lesefehler absichtlich/versehentlich beenden. Angenommen, der Elternteil lebt noch, können Sie auf das Kind warten und den Beendigungsstatus und den Rückkehrcode lesen? – Ram

+0

Übergeordneter Prozess ist eine Shell-Skriptdatei, die den untergeordneten Prozess startet und auf seiner PID wartet. –

+0

Der Elternprozess ist nicht über den SIGBUS-Absturz des Kindes informiert und wartet immer noch auf seine PID. Der untergeordnete Prozess erhält SIGBUS, wenn er versucht, von einem der PCI-Geräteregister zu lesen. Ich verlasse diesen Kindprozess nicht und es geht in den Zombie-Zustand, sobald der Lesefehler passiert ist. –

Antwort

0

Ich verstehe, dass die PCI-Hardware, die mmaped ist, nicht reagiert. Es ist also angemessen, dass nur der Kernel mit dem Fehler fertig wird.

Der Fehler wird nicht auf Benutzerebene weitergegeben, da dies kein Softwarefehler ist. Wir erhalten also keinen Core Dump (Kernel oder Userspace), da es sich nicht um einen Softwarefehler handelt.

Der Exception-Handler für die Maschinenüberprüfung im Kernel informiert darüber, welcher Hardwarefehler aufgetreten ist und welche Adresse/Daten (abhängig von der Ursache) relevant sind. - Aus Hardware-Sicht weiter untersucht werden müssen.

Verwandte Themen