场景:
有一个复杂的软件,手工启动很烦人。我所做的是创建一个python脚本来启动可执行文件并附加gdb进行调试。在
进程启动脚本:确保设置了环境变量。在
确保将本地生成目录添加到环境的LD_LIBRARY_PATH变量中。在
将当前工作目录更改为可执行文件的预期位置(不是我的设计)
使用配置文件启动可执行文件(唯一的命令行选项)
将输出从可执行文件传送到第二个日志记录进程
记住可执行文件的PID,然后启动并将gdb附加到正在运行的可执行文件。在
剧本是可行的,但有一点需要注意。ctrl-c不会中断被调试对象并将控制权返回给gdb。因此,如果我在没有活动断点的情况下“继续”进程,那么它必须从另一个shell终止/中断。顺便说一句,运行“kill-s SIGINT<;pid>;”,其中<;pid>;是调试对象的pid,确实可以让我回到gdb的提示。。。但不得不这样做真的很烦人
一开始我以为Python正在获取SIGINT信号,但事实似乎并非如此,因为我设置了信号处理程序,将信号转发给被调试器,这并不能解决问题。在
我尝试了对python脚本的各种配置(调用操作系统生成*似乎不管我怎么做,如果python启动了子进程,SIGINT(ctrl-c)信号不会被路由到gdb或子进程。在
当前思路这可能与需要
为被调试者和gdb单独的进程组id…对此有信心吗?在
SELinux可能存在错误?在
信息:gdb 6.8版
Python2.5.2(Python2.6.1也存在问题)
SELinux环境(向进程传递信号的错误?)在
我考虑过的备选方案:设置一个.gdbinit文件来完成脚本所做的工作、环境变量和当前工作目录是这种方法的一个问题。在
启动可执行文件并手动附加gdb(恶心)
问题:
如何自动化大型项目的启动/调试?在
更新:
我试过尼古拉斯·莱利下面的例子,在我家的Macintosh上,它们都允许cntl-c以不同的程度工作,在生产boxen(我现在相信它可能运行SELinux)上,它们不。。。在