我通过GDB(版本7.12,Ubuntu 14.04)运行一个非常大的应用程序(二进制有2GB,主要是因为调试符号),所以我可以捕获所有崩溃和有完整的后退+ coredumps: ulimit -c unlimited
和bt/bt full/info thread/generate-core-file
崩溃后。GDB自杀(突然杀死调试过程)
但是,我很少遇到一些奇怪的行为:应用程序在日志中立即关闭Program terminated with signal SIGKILL, Killed.
,但是我是100%正面的,没有其他任何来自系统的杀死它,负责为此的GDB负责。当发生这种情况时,它不会产生任何回溯/ coredump /等。
据我看到,直到现在,这发生在大(1天)的正常运行时间。每当正常的崩溃发生在〜1天的正常运行时间(我不是在谈论杀死情况,而是正常崩溃),并且GDB生成backtrace + coredump时,核心处理器大小为〜100GB。所以现在唯一需要假设的是GDB消耗了太多的内存来处理它。不幸的是,当发生这种情况时,我不知道确切的内存使用情况(因为它是意外的),但交换文件几乎是空的,这很可能意味着它没有真正耗尽内存。
关于如何调试这种情况的想法?
这可能是OOM杀手。看看'dmesg'的输出:'内存不足:杀死进程'。 – ks1322
你是对的,检查dmesg日志,我发现'ps被调用的oom-killer:gfp_mask = 0x1042d0,order = 2,oom_score_adj = 0'内存不足:杀死进程8057(MY_BINARY_NAME_HERE)得分909或牺牲子对象发生了。添加一个单独的答案,以便我可以接受它。同时,关于为什么交换将是空的任何想法?在这种情况下,我会预料它会变满。或者,它可能与同一进程的内存已满... – Shocker