生成以GDB批处理模式运行的进程核心

问题描述 投票:0回答:1

这可能是一个奇怪的特殊情况,但我在 GDB 批处理模式下运行一个进程,但运行的进程有自己的服务器控制台,需要保持打开状态才能继续运行。

它在GDB下运行,因此在崩溃时,它会调用脚本文件来执行一些命令并防止数据丢失。因为这一切都需要继续运行,所以我首先在屏幕会话下运行脚本,然后与屏幕分离。

但是,如果出现内存泄漏等问题,我希望能够在 oom-killer 发送 SIGKILL 信号之前创建核心转储文件。如果这样做,我将永远没有机会创建核心转储。

我运行的命令是

gdb --batch -return-child-result --command=gdbcommands --args <binary-name> 2>&1 | tee >(ts "%d-%m-%y %H_%M_%S" > "console-${date}.log")

gdb命令的内容是

`捕获信号 SIGBUS SIGFPE SIGILL SIGSEGV SIGSYS SIGXCPU SIGXFSZ SIGABRT 命令 生成核心文件 设置登录 线程应用所有 bt 完整 调用关闭() 设置 $crashed = 1 结束

设置$崩溃= 0 跑

退出$崩溃了 ` 当进程运行时,它会打开应用程序控制台并且无法关闭,因此我无法在需要时运行 gcore,我也无法运行 gdb 的新会话来执行 gcore,因为该进程已经安装。

我的问题是是否可以与已经运行的 gdb 会话建立另一个连接,或者是否有其他方法可以在不中断进程的情况下获取 gdb 下运行的进程的核心转储?

有一个非常奇怪的问题,它开始消耗所有可用内存,以至于 oomkiller 在进程自行崩溃之前杀死该进程,使我没有核心转储。

应用程序像这样在 gdb 下运行并不是因为它会崩溃,而是如果崩溃了,它需要尝试调用关闭函数来保存应用程序当前收集的任何实时敏感数据。

我尝试打开另一个 gdb 实例来挂载并创建核心转储,但系统不允许。

我也尝试安装 ProcDump,但该应用程序似乎也只是使用 gcore 来创建转储,但也失败了。

batch-file gdb dump core procdump
1个回答
0
投票

我的问题是是否可以与已经运行的 gdb 会话建立另一个连接,

不容易。

您无法两次附加应用程序,因此“第二个GDB”、

ProcDump
等无法工作,并且您无法与原始
gdb --batch
交互。

您可以使用第二 GDB 附加第一个 GDB,并使第一个 GDB 运行

gcore
命令(通过调用相应的函数),但这种“纸牌屋”不太可能可靠地工作。

或者有没有其他方法可以在不中断进程的情况下获取 gdb 下运行的进程的核心转储?

您最好的选择可能是让目标进程耗尽内存并崩溃,而不是等待 OOM 杀手。适当设置

ulimit -v
应该可以实现这一点。

附注

应用程序像这样在 gdb 下运行并不是因为它会崩溃,而是如果崩溃了,它需要尝试调用关闭函数来保存应用程序当前收集的任何数据

除非你的“关闭”函数写得非常仔细并且是异步信号安全的,否则正确工作的机会很小。

© www.soinside.com 2019 - 2024. All rights reserved.