subprocess モジュールを使用してクラッシュしたプログラムの出力を取得する際に問題があります。私はpython2.7とサブプロセスを使用して、セグメンテーション違反を取得するために奇妙な引数でプログラムを呼び出しています。プログラムを呼び出すために、次のコードを使用します。
proc = (subprocess.Popen(called,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE))
out,err=proc.communicate()
print out,err
呼び出されるのは、プログラムの名前と引数を含むリストです (サブプロセスがまったく好まない NULL バイトを除くランダムなバイトを含む文字列)
プログラムがクラッシュしない場合、コードは動作し、stdout と stderr を表示しますが、クラッシュすると、有名な「セグメンテーション違反」を表示する代わりに、out と err が空になります。
プログラムがクラッシュした場合でも、エラーを取得してエラーを回避する方法を見つけたいと考えています。
check_output / call / check_call メソッドも試しました
いくつかの追加情報:
Python仮想環境のArchlinux 64ビットでこのスクリプトを実行しています(ここでは重要なことではありませんが、わかりません:p)
実行しようとしている C プログラムでセグメンテーション違反が発生し、バッファ オーバーフローの結果です。
問題は、セグメンテーション違反が発生したときに、サブプロセスで何が起こったのかの出力を取得できないことです
私はリターンコードを正しく取得します: -11 (SIGSEGV)
Pythonを使用すると、次のようになります:
./dumb2 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ('Exit code was:', -11) ('Output was:', '') ('Errors were:', '')
pythonの外にいる間、私は得る:
./dumb2 $(perl -e "print 'A'x50") BEGINNING OF PROGRAM AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA END OF THE PROGRAM Segmentation fault (core dumped)
シェルの戻り値は同じです: echo $? 139 を返すので -11 ($? & 128)