来自 GDB 的消息“在启动程序期间以信号 SIGKILL 终止”

Posted

技术标签:

【中文标题】来自 GDB 的消息“在启动程序期间以信号 SIGKILL 终止”【英文标题】:Message "During startup program terminated with signal SIGKILL" from GDB 【发布时间】:2018-04-29 02:09:31 【问题描述】:

我在使用 GNU 工具构建的 AIX 上调试 C++ 程序时遇到问题。当程序在调试器之外运行时:

-bash-4.3$ ./cryptestcwd v
Segmentation fault (core dumped)

当程序在GDB下运行时,调试器打印出消息During startup program terminated with signal SIGKILL, Killed.并退出:

另外一个问题是,这只发生在Autotools front-end 上。我们的常规 GNUmakefile 不会发生这种情况。我们为 Autotools 和 GNUmakefile 提供相同的参数。我们知道 Autotools adds additional options 甚至 adds C files 到 C++ 项目,但我们无法控制它。

During startup program terminated with signal SIGKILL, Killed 有一个相关问题,但没有有用的答案。另外两个相关问题只是指出SIGKILL 无法被捕获。另见Debugging program that catches SIGKILL under Linux 和Handling signals with gdb。

如何进一步调试问题?

【问题讨论】:

可能需要使用繁琐的“分而治之”的方法? #ifdef 去掉一半的代码,重新编译,运行,重复…… 如果你从 shell 运行程序,而不使用 gdb,你会得到不同的行为吗? 你可以用一个构造函数来做一些无意义但很难编译出来的类,在启动过程中尽早强制构造这个类,并在其中放置一个断点这个构造函数。从那里你也许可以通过 pre-main 代码并找到死因。 @Mark - 是的,问题存在于调试器内部和外部。另一个问题是,我们正在尝试添加一个Autotools front-end。我们的常规 [手写] GNUmakefile 很好。该问题仅在 Autotools 二进制文件下出现。上图是 Autotools 二进制文件。 这样您就可以轻松比较编译和链接命令。 【参考方案1】:

启动时的SIGKILL 很可能意味着 AIX 运行时加载程序找不到二进制链接所针对的某个库(当发生这种情况时,Linux 运行时加载程序会生成更有用的错误消息)。

您应该确认ldd cryptestcwd 没有抱怨任何事情。

您还可以尝试将在 GDB 之外运行程序时生成的 core 加载到 GDB 中——那里可能有其他线索(使用 info sharedwherex/i $pc 命令)。

【讨论】:

实际上,与 linux!loader 不同,AIX!loader 确实解释了未解析的外部禁止加载程序的原因。在这些情况下没有核心转储。

以上是关于来自 GDB 的消息“在启动程序期间以信号 SIGKILL 终止”的主要内容,如果未能解决你的问题,请参考以下文章

Windows下CDT GDB调试

从ruby调用和控制gdb

GDB 符号来自哪里?

Oracle 更新/插入卡住,DB CPU 100%,并发高,来自客户端的 SQL*Net 等待消息

GDB 远程调试 - 无法为默认可视化器实例化打印机

调试 C++ 程序时出现奇怪的 gdb 消息