Capturar a mensagem "Falha na segmentação" para um subprocesso com falha: não sai e erra após uma chamada para se comunicar ()
Tenho problemas ao usar o módulo subprocesso para obter a saída de programas com falha. Estou usando python2.7 e subprocesso para chamar um programa com argumentos estranhos para obter alguns segfaults. Para chamar o programa, eu uso o seguinte código:
proc = (subprocess.Popen(called,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE))
out,err=proc.communicate()
print out,err
chamado é uma lista que contém o nome do programa e o argumento (uma sequência que contém bytes aleatórios, exceto o byte NULL do qual o subprocesso não gosta)
O código se comporta e mostra o stdout e o stderr quando o programa não falha, mas quando falha, o out e o error estão vazios, em vez de mostrar a famosa "falha de segmentação".
Desejo encontrar uma maneira de obter e errar, mesmo quando o programa falhar.
Espero que alguém aqui tenha uma ideia :)
PS: Eu também tentei os métodos check_output / call / check_call
EDITAR:
Estou executando este script em um Archlinux 64 bits em um ambiente virtual python (não deve ser algo importante aqui, mas você nunca sabe: p)
O segfault acontece no programa C que estou tentando executar e é uma conseqüência de um estouro de buffer
O problema é que, quando o segfault ocorre, não consigo obter a saída do que aconteceu com o subprocesso
Eu recebo o código de retorno corretamente: -11 (SIGSEGV)
Usando python eu recebo:
./dumb2 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
('Exit code was:', -11)
('Output was:', '')
('Errors were:', '')
Enquanto estiver fora do python, recebo:
./dumb2 $(perl -e "print 'A'x50")
BEGINNING OF PROGRAM
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
END OF THE PROGRAM
Segmentation fault (core dumped)
O valor de retorno do shell é o mesmo: echo $? retorna 139 so -11 ($? & 128)