【问题标题】:C++ Linux Binary terminated with signal SIGKILL - why? (loaded in GDB)C++ Linux Binary 以信号 SIGKILL 终止 - 为什么? (加载到 GDB 中)
【发布时间】:2012-09-05 19:37:37
【问题描述】:

所以我在 GDB 中启动了我的 c++ 应用程序,当它退出时,我基本上得到:

[Thread 0x7fff76e07700 (LWP 6170) exited]
[Thread 0x7fff76f08700 (LWP 6169) exited]
[Thread 0x7fff77009700 (LWP 6168) exited] 
...
Program terminated with signal SIGKILL, Killed. The program no longer exists.
(gdb)

我真的不知道为什么会发生这种情况,为什么我不能回溯看看它是如何退出的?有人有想法么?它不应该结束:(

谢谢!

【问题讨论】:

    标签: c++ ubuntu gdb


    【解决方案1】:

    我真的不知道为什么会发生这种情况,

    这通常意味着要么

    • 其他一些进程执行了kill -9 <your-pid>,或者
    • 内核OOM杀手认为你的进程消耗了太多资源,并终止了它(实际上内核为它执行了kill -9)。您应该查看/var/log/messages(Ubuntu 变体上的/var/log/syslog)中的痕迹 - 内核通常会在 OOM 某个进程时记录一条消息。

    为什么我不能回溯看看它是如何退出的?

    因为要查看回溯,进程必须存在。如果它不存在,它就没有堆栈,所以不能有回溯。

    【讨论】:

    • 或者程序员出于某种原因想变得聪明,其中一个线程正在使用 SIGKILL 杀死自己的程序。
    • 我应该检查另一个日志吗(我在 ubuntu 上)?
    • @Geesu:检查 /var/log/syslog
    • 另外strace可以帮助您找到访问无法访问或受限操作系统资源的尝试,并找到sigkill的原因。
    • 就我而言,这是内存不足,系统似乎将其杀死:[417558.146474] 内存不足:杀死进程 20867 (xxxx) 得分 42 或牺牲孩子 [417558.147973] 杀死进程 20867 (xxxx) 总-vm:362268kB, anon-rss:271668kB, file-rss:2728kB, shmem-rss:0kB plumbr.io/blog/memory-leaks/…
    【解决方案2】:

    如果您使用的是 Unix/Linux,您还应该能够在终端上输入 dmesg 并查看进程终止的原因。就我而言,确实是OOM。 here is a screenshot of my kernel log shortly after the termination

    【讨论】:

    • dmesg要走的路
    • 是的,dmesg 工作并告诉你它发生的原因。就我而言,它显示 [5087530.276277] Out of memory: Kill process 19056 ... [5087530.276324] Killed process 19056 ...
    【解决方案3】:

    有可能是进程跑到了cpu time ulimit。如果“cpu time”设置为“unlimited”以外的任何值,请从进程实际启动的环境中检查 ulimit -a

    【讨论】:

    • 这不会导致分段错误吗?那不是缓冲区溢出吗?
    • @yash101 为什么会导致段错误?分段错误是指以不允许的方式访问内存。它与 CPU 时间无关。
    • 我什么时候发表评论的,为什么?这没有道理!我觉得有些东西变了!
    【解决方案4】:

    在我的情况下是崩溃 (AV)。即使附加了 GDB,我也无法发现这种违规行为。
    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      相关资源
      最近更新 更多