当前位置: 首页 > 面试题库 >

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

仰雅昶
2023-03-14
问题内容

使用子进程模块获取崩溃程序的输出时遇到问题。我正在使用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反向移植,可以很好地完成工作

  • 求助:我用过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)



 类似资料:
  • Kafka过去在我自己的电脑上工作得很好。我正在另一台电脑上工作,上面写着 为目录C:\tmp\kafka logs(kafka.server.LogDirFailureChannel)java中的\uu consumer\u offset-41创建日志时出错。木卫一。IOException:映射在sun失败。尼奥。总经理。Kafka地图(FileChannelImpl.java:940)。日志抽

  • 本文向大家介绍iOS 捕获程序崩溃日志,包括了iOS 捕获程序崩溃日志的使用技巧和注意事项,需要的朋友参考一下 iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者? 下面就介绍如何在iOS中实现: 1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作 官方文档介绍:Sets the top-level error-handling function

  • 问题内容: 我正在Windows命令提示符下运行python脚本。它调用下面的函数,该函数使用LAME将MP3文件转换为wave文件。 不幸的是,LAME总是在某些MP3上崩溃(并达到其名称)。出现Windows“您的程序已崩溃”对话框,该对话框冻结了我的脚本。关闭窗口对话框后,将引发AudioProcessingException。无需告诉Windows关闭,我只想脚本引发异常,然后转到下一个M

  • 把我的城市飞艇升级到7.2。没有编译错误和应用程序运行良好,直到它收到一个推送消息。此时,它将崩溃,出现以下堆栈跟踪: 当我检查类是否可见(Cmd-O)并开始键入时,类立即出现。 有人遇到过这个吗?我不知道怎么修好它。多谢了。

  • 我注意到,当我在后台发送FCM负载时,我看到通知消息被显示,这与文档一致,但我看到收到的每个通知消息的本机通知。当我的应用程序在后台时,我收到了3条推送消息(带有通知负载),现在我在通知托盘中看到了3条本机通知。为什么他们没有崩溃?默认情况下,根据FCM文档,所有通知消息都是可折叠的。参考文件:https://firebase.google.com/docs/cloud-messaging/con

  • JAVAlang.Exception在c.b.a.a.f.b.a(未知源:0)在c.b.a.a.e.c.nc的初始化错误。(未知来源:12)在c.b.a.a.b.a.(未知来源:8)在com。谷歌。火基。不应用消息传递。内部的注射模块。ClearcutLoggerClientModule。在此处输入代码时提供ClearCutClient(未知来源:5)。谷歌。火基。不应用消息传递。内部的注射模块。