GDB批处理模式下运行进程时获取核心转储的方法咨询
如何在不中断进程的前提下获取GDB中运行进程的核心转储?
当前运行方式
我通过以下方案保障进程运行:
- 用GDB批处理模式启动进程,同时借助Screen会话后台运行,核心目的是进程崩溃时自动调用
shutdown()保存敏感数据,同时生成核心转储和完整线程回溯日志。 - 启动命令:
gdb --batch -return-child-result --command=gdbcommands --args <binary-name> 2>&1 | tee >(ts "%d-%m-%y %H_%M_%S" > "console-${date}.log")
gdbcommands配置文件内容:
catch signal SIGBUS SIGFPE SIGILL SIGSEGV SIGSYS SIGXCPU SIGXFSZ SIGABRT commands generate-core-file set logging on thread apply all bt full call shutdown() set $crashed = 1 end set $crashed = 0 run quit $crashed
现存问题
- 进程因内存泄漏触发OOM-killer时,会被直接发送SIGKILL信号,来不及触发GDB里的信号捕获逻辑生成核心转储,导致无法排查内存问题。
- 无法通过新的GDB会话附加到该进程(进程已被当前GDB实例挂载),也无法直接执行
gcore命令;尝试安装ProcDump工具,也因依赖gcore而失败。 - 进程自带独立的服务器控制台且必须保持开启,无法通过控制台按需手动生成转储。
我的疑问
有没有办法连接到已经运行的GDB会话,或者通过其他方式在不中断进程运行的前提下,获取它的核心转储文件?
内容的提问来源于stack exchange,提问作者The Shadow Priest Dazzle
相关产品推荐
相关产品推荐

