一尘不染

捕获崩溃子进程的“ Segmentation fault”消息:在调用communication()之后没有out和err

python

使用子进程模块获取崩溃程序的输出时遇到问题。我正在使用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)


阅读 302

收藏
2020-12-20

共1个答案

一尘不染

编辑:回到这里:它与python3的子进程一样具有魅力,如果您在linux上,则有一个名为subprocess32的python2反向移植,可以很好地完成工作

  • 求助:我用过pexpect,它有效
    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)

2020-12-20