我在使用 subprocess 模块获取崩溃程序的输出时遇到问题。我正在使用 python2.7 和 subprocess 调用带有奇怪参数的程序以获得一些段错误为了调用程序,我使用以下代码:
proc = (subprocess.Popen(called,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE))
out,err=proc.communicate()
print out,err
调用是一个包含程序名称和参数的列表(一个包含随机字节的字符串,除了子进程根本不喜欢的 NULL 字节)
当程序没有崩溃时,代码会运行并向我显示 stdout 和 stderr,但是当它确实崩溃时,out 和 err 是空的,而不是显示著名的“分段错误”。
即使程序崩溃,我也希望找到一种方法来获取错误。
我还尝试了 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)
shell的返回值是一样的:echo $? 返回 139 所以 -11 ($? & 128)