来自 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 shared
、where
、x/i $pc
命令)。
【讨论】:
实际上,与 linux!loader 不同,AIX!loader 确实解释了未解析的外部禁止加载程序的原因。在这些情况下没有核心转储。以上是关于来自 GDB 的消息“在启动程序期间以信号 SIGKILL 终止”的主要内容,如果未能解决你的问题,请参考以下文章