设想:
有一个复杂的软件,手动启动很烦人。我所做的是创建一个 python 脚本来启动可执行文件并附加gdb进行调试。
进程启动脚本:
- 确保设置了环境变量。
- 确保将本地构建目录添加到环境
LD_LIBRARY_PATH
变量中。 - 将当前工作目录更改为可执行文件期望的位置(不是我的设计)
- 使用配置文件启动可执行文件是唯一的命令行选项
- 将可执行文件的输出通过管道传输到第二个日志记录进程
- 记住可执行文件的 PID,然后启动并将 gdb 附加到正在运行的可执行文件。
该脚本有效,但有一个警告。ctrl-c 不会中断被调试者并将控制权返回给 gdb。因此,如果我在没有活动断点的情况下“继续”,我将永远无法再次停止该进程,它必须被另一个 shell 杀死/中断。顺便说一句,运行“kill -s SIGINT <pid>”,其中 <pid> 是被调试者的 pid,确实让我回到了 gdb 的提示符......但是必须以这种方式做事真的很烦人
起初我以为 Python 正在抓取 SIGINT 信号,但情况似乎并非如此,因为我设置了信号处理程序将信号转发给被调试者,但这并不能解决问题。
我已经尝试了对 python 脚本的各种配置(调用 os.spawn* 而不是子进程等)。似乎无论我怎么做,如果 python 启动子进程,SIGINT (ctrl-c) 信号不要路由到 gdb 或子进程。
目前的思路
- 这可能与被调试者和 gdb 需要一个单独的进程组 ID 相关......对此有任何信任吗?
- SELinux 可能的错误?
信息:
- 数据库 6.8
- Python 2.5.2(Python 2.6.1 也存在问题)
- SELinux 环境(向进程传递信号的错误?)
我考虑过的替代方案:
- 设置一个 .gdbinit 文件来完成脚本所做的工作、环境变量和当前工作目录是这种方法的一个问题。
- 手动启动可执行文件并附加 gdb (yuck)
问题: 您如何自动化大型项目的启动/调试?
更新: 我在下面尝试了 Nicholas Riley 的示例,在我家里的 Macintosh 上,它们都允许 cntl-c 以不同的程度工作,在生产 boxen(我现在相信它可能正在运行 SELinux)上它们不...