2017-01-30 5 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デバイスレジスタの1つから読み取ろうとすると、SIGBUSを取得します。私はこの子プロセスを終了していませんし、読み込みエラーが発生するとすぐにゾンビ状態になります。 –

答えて

0

mmapedされたPCIハードウェアが応答していないことを理解します。したがって、エラーに対処するのはカーネルだけであることが適切です。

エラーはソフトウェアの障害ではないため、ユーザーレベルに伝播されません。したがって、ソフトウェアの障害ではないため、コアダンプ(カーネルまたはユーザースペースのいずれか)は取得できません。

カーネル内のマシンチェック例外ハンドラは、ハードウェアの障害の内容と、関連するアドレス/データ(原因による)を示します。ハードウェアの観点からさらに調査する必要があります。

関連する問題