【问题标题】:Message "During startup program terminated with signal SIGKILL" from GDB来自 GDB 的消息“在启动程序期间以信号 SIGKILL 终止”
【发布时间】: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 LinuxHandling signals with gdb

如何进一步调试问题?

【问题讨论】:

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

标签: c++ gdb aix


【解决方案1】:

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

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

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

【讨论】:

  • 实际上,与 linux!loader 不同,AIX!loader 确实解释了未解析的外部禁止加载程序的原因。在这些情况下没有核心转储。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2018-10-31
  • 1970-01-01
  • 2020-01-29
相关资源
最近更新 更多