使用子进程模块获取崩溃程序的输出时遇到问题。我正在使用python2.7和子进程来调用带有奇怪参数的程序,以获得一些段错误。为了调用该程序,我使用以下代码:
proc = (subprocess.Popen(called, stdout=subprocess.PIPE, stderr=subprocess.PIPE)) out,err=proc.communicate() print out,err
被调用的是一个包含程序名称和参数的列表(一个包含随机字节的字符串,除了子进程根本不喜欢的NULL字节)
该代码的行为会在程序不崩溃时向我显示stdout和stderr,但是在程序崩溃时,out和err为空,而不是显示著名的“分段错误”。
我希望找到一种方法,即使程序崩溃也不会出错。
希望有人在这里:)
PS:我也尝试过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 so -11($?&128)
编辑:回到这里:它与python3的子进程一样具有魅力,如果您在linux上,则有一个名为subprocess32的python2反向移植,可以很好地完成工作
def cmdlineCall(name, args): child = pexpect.spawn(name, args) # Wait for the end of the output child.expect(pexpect.EOF) out = child.before # we get all the data before the EOF (stderr and stdout) child.close() # that will set the return code for us # signalstatus and existstatus read as the same (for my purpose only) if child.exitstatus is None: returncode = child.signalstatus else: returncode=child.exitstatus return (out,returncode)
PS:慢一点(因为它会生成伪tty)