У меня есть проблемы с использованием модуля подпроцесса, чтобы получить выход из разбитых программ. Я использую python2.7 и подпроцесс для вызова программы со странными аргументами, чтобы получить некоторые segfaults Чтобы вызвать программу, я использую следующий код:
proc = (subprocess.Popen(called,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE))
out,err=proc.communicate()
print out,err
called - это список, содержащий имя программы и аргумент (строка, содержащая случайные байты, кроме байта NULL, который подпроцесс не нравится вообще)
Код ведет себя и показывает мне stdout и stderr, когда программа не сбой, но когда она вылетает, out и err являются пустыми, а не показывают знаменитую "ошибку сегментации".
Я хочу найти способ получить и исправить, даже если программа сбой.
Надеюсь, что кто-то здесь как идея:)
PS: Я также попробовал методы check_output/call/check_call
ИЗМЕНИТЬ:
-
Я запускаю этот script на 64-битных Archlinux в виртуальной среде python (здесь не должно быть что-то важное, но вы никогда не знаете: p)
-
Segfault происходит в программе C, которую я пытаюсь запустить, и является следствием переполнения буфера
-
Проблема заключается в том, что когда возникает segfault, я не могу получить результат того, что произошло с подпроцессом
-
Я получаю код возврата справа: -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)