代码之家  ›  专栏  ›  技术社区  ›  oz10

如何使大型项目的启动/调试自动化?

  •  4
  • oz10  · 技术社区  · 17 年前

    脚本:

    有一个复杂的软件,手工启动很烦人。我所做的是创建一个python脚本来启动可执行文件并附加 GDB 用于调试。

    进程启动脚本:

    • 确保设置了环境变量。
    • 确保将本地生成目录添加到环境的 LD_LIBRARY_PATH 变量。
    • 将当前工作目录更改为可执行文件预期的位置(不是我的设计)
    • 使用配置文件启动可执行文件唯一的命令行选项
    • 将输出从可执行文件传输到第二个日志记录进程
    • 记住可执行文件的PID,然后启动并将gdb附加到正在运行的可执行文件。

    这个剧本很好用,但有一点需要注意。 ctrl-c不会中断调试并将控制返回到gdb。 因此,如果我在没有活动断点的情况下“继续”,我就再也无法停止进程,那么必须从另一个shell中终止/中断进程。顺便说一句,运行“kill-s sigint<pid>”;其中<pid>是调试对象的pid会让我返回gdb的提示…但是这样做真的很烦人

    起初,我以为python正在获取sigint信号,但当我设置信号处理程序将信号转发给debugee时,情况似乎并非如此,这并不能解决问题。

    我尝试过对python脚本进行各种配置(调用os.spawn*而不是子进程等),不管怎么说,如果python启动了子进程,sigint(ctrl-c)信号都不会被路由到gdb或子进程。

    当前的思维方式

    • 这可能与需要 Debugee&gdb的单独进程组ID…对此有任何依据吗?
    • 可能是SELinux的错误?

    信息:

    • GDB 6.8
    • python 2.5.2(python 2.6.1也存在问题)
    • SELinux环境(向进程发送信号的错误?)

    我考虑过的备选方案:

    • 设置一个.gdbinit文件来完成脚本所做的大部分工作,环境变量和当前工作目录都是这种方法的一个问题。
    • 启动可执行文件并手动附加gdb(yuck)

    问题: 如何使大型项目的启动/调试自动化?

    更新: 我试过尼古拉斯·莱利下面的例子,在我的家用麦金塔电脑上,它们都允许CNTL-C工作到不同的学位,在生产盒上(我现在认为可能运行SELinux),它们不……

    3 回复  |  直到 17 年前
        1
  •  3
  •   Nicholas Riley    17 年前

    您可以尝试忽略它,而不是将信号从python转发到调试对象。以下内容对我很有用:

    import signal
    signal.signal(signal.SIGINT, signal.SIG_IGN)
    
    import subprocess
    cat = subprocess.Popen(['cat'])
    subprocess.call(['gdb', '--pid=%d' % cat.pid])
    

    有了这个,我可以在gdb中反复地^c,并且毫无问题地中断调试对象,但是我确实看到了一些奇怪的行为。

    顺便说一下,我在将信号转发到目标进程时也没有问题。

    import subprocess
    cat = subprocess.Popen(['cat'])
    
    import signal, os
    signal.signal(signal.SIGINT,
                  lambda signum, frame: os.kill(cat.pid, signum))
    
    subprocess.call(['gdb', '--pid=%d' % cat.pid])
    

    那么,也许你的案子还发生了什么?如果您发布了一些中断的代码,可能会有所帮助。

        2
  •  0
  •   pjz    17 年前

    你的评论指出你在用油灰粉刷…你有控制型TTY吗?有了openssh,你会想要添加-t选项,我不知道putty会不会像你使用它那样做。

    另外:您可以尝试使用cygwin的ssh而不是putty。

        3
  •  0
  •   Zak    17 年前

    如果您已经设置了一个当前脚本来执行此操作,但在自动执行部分脚本时遇到问题,那么您可以获取Expect并使用它来提供设置,然后在Expect中返回到交互模式以启动该过程。然后您仍然可以让您的ctrl-c中断。

    推荐文章