Ich habe Probleme mit dem Subprozess-Modul, um die Ausgabe von abgestürzten Programmen zu erhalten. Ich verwende python2.7 und subprocess ein Programm mit seltsamen Argumente aufrufen, um einige segfaults Um das zu bekommen, das Programm zu nennen, verwende ich den folgenden Code:Capture "Segmentation Fault" Nachricht für einen abgestürzten Subprozess: nein out und err nach einem Aufruf zur Kommunikation()
proc = (subprocess.Popen(called,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE))
out,err=proc.communicate()
print out,err
genannt ist eine Liste der enthaltenden Name des Programms und das Argument (eine Zeichenfolge mit zufälligen Bytes mit Ausnahme des NULL-Byte, das Subprozess überhaupt nicht mag)
Der Code verhalten und zeigen Sie mir die stdout und stderr, wenn das Programm nicht abstürzt, aber wenn es stürzt ab, und Fehler sind leer, anstatt den berühmten "Segmentierungsfehler" zu zeigen.
Ich möchte einen Weg zu erhalten und Fehler auch beim Programmabsturz finden.
Hoffnung jemand hier als Idee :)
PS: Ich habe auch versucht die check_output/Call/check_call Methoden
EDIT:
Ich laufe dieses Skript auf einem Archlinux 64 Bit in einer virtuellen Python-Umgebung (sollte hier nicht wichtig sein, aber man weiß nie: p)
Der Segfault passiert im C-Programm m Ich versuche zu laufen und ist eine Folge eines Pufferüberlauf
Das Problem ist, dass, wenn der segfault auftritt, kann ich nicht die Ausgabe von dem, was passiert mit subprocess
Ich erhalte die Rückkehr rechts: -11 (SIGSEGV)
mit python i erhalten:
./dumb2 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ('Exit code was:', -11) ('Output was:', '') ('Errors were:', '')
Während draußen python ich:
./dumb2 $(perl -e "print 'A'x50") BEGINNING OF PROGRAM AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA END OF THE PROGRAM Segmentation fault (core dumped)
Der Rückgabewert der Shell ist der gleiche: echo $? 139 kehrt so -11 ($? & 128)
versuchen ['out, returncode = run (command, withexitstatus = 1); signal = 128 - returncode'] (http://stackoverflow.com/a/22253472/4279) – jfs
hinweis: 'child.before' ist eine Zeichenkette. Es ist nicht abrufbar; Entferne '()'. – jfs
geben signalstatus und exitstatus nicht als denselben Wert zurück; Sie sind nicht. – jfs