我使用subprocess模块获取崩溃程序的输出时遇到了问题。 我正在使用Python2.7和subprocess来调用一个带有奇怪参数的程序,以便获得一些段错误。 为了调用该程序,我使用以下代码:
proc = (subprocess.Popen(called,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE))
out,err=proc.communicate()
print out,err
called是一个包含程序名称和参数的列表(字符串,其中包含随机字节,除了subprocess完全不喜欢的NULL字节)
当程序没有崩溃时,该代码会表现出并显示stdout和stderr,但当它崩溃时,out和err为空,而不是显示著名的“Segmentation fault”。
我希望找到一种方法,即使程序崩溃了,也能获得out和err。
我还尝试了check_output / call / check_call方法
一些附加信息:
我在python虚拟环境中的Archlinux 64位上运行此脚本(这里不应该有什么重要的东西,但你永远不知道:p)
segfault发生在我正在尝试运行的C程序中,是缓冲区溢出的结果
问题在于当segfault发生时,我无法获取用subprocess发生的输出
我正确地获得了返回码:-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)
Shell的返回值相同:echo $? 返回139,因此为-11($?&128)
err
变量中),也就是说,在Ubuntu上至少不需要使用pexpect
。 - jfs