我的节目是" Killed"

时间:2015-04-20 12:04:21

标签: c++ linux kernel debian kill

可能是由question中建议的内核。我想知道为什么我被杀了,就像暗杀发生的那样。 :)

此外,我能做些什么来让我的程序正常执行?


纪事

我的程序正常执行。但是,我们遇到了一个大数据集,1.000.000 x 960浮点数,而我家里的笔记本电脑无法接受它(给了std::bad_alloc())。

现在,我在实验室中,在处理器3.00GHz×4的9.8 GiB的台式机中,它的内存是笔记本电脑的两倍以上。

在家中,数据集无法加载到存储数据的std::vector中。在实验室中,这已经完成,程序继续建立数据结构。

这是我最后一次听到它:

Start building...
Killed

实验室中的桌面在Debian 8上运行。我的程序按预期运行数据集的子集,特别是1.00.000 x 960浮点数。


修改

strace输出最终可用:

...
brk..
brk(0x352435000)                        = 0x352414000
mmap(NULL, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7f09c1563000
munmap(0x7f09c1563000, 44683264)        = 0
munmap(0x7f09c8000000, 22425600)        = 0
mprotect(0x7f09c4000000, 135168, PROT_READ|PROT_WRITE) = 0
...
mprotect(0x7f09c6360000, 8003584, PROT_READ|PROT_WRITE) = 0
+++ killed by SIGKILL +++

所以这告诉我们我的记忆力不足,我猜测

2 个答案:

答案 0 :(得分:3)

在C ++中,float是一个(32位)浮点数: http://en.wikipedia.org/wiki/Single-precision_floating-point_format

这意味着您正在分配(没有开销) 3 840 000 000 bytes 数据。

或大约3,57627869千兆字节..

让我们安全地假设向量的标题与数据无关,并继续使用此数字..

这是要构建的大量数据,Linux可能会认为这只是一个内存漏洞,并通过杀死应用程序来保护自己:

https://unix.stackexchange.com/questions/136291/will-linux-start-killing-my-processes-without-asking-me-if-memory-gets-short

我不认为这是一个过度使用的问题,因为你实际上在一个应用程序中使用了近一半的内存。

但也许..考虑到这只是为了好玩..你在构建32位应用程序吗? 你正在接近2 ^ 32(4Gb)的内存空间,如果你的程序是32位的话可以被程序解决..

所以如果你有另一个大的向量分配... bum bum bum

答案 1 :(得分:0)

首先安装信号处理程序,例如

static bool installSignalHandler(int sigNumber, void (*handler)(int) = signal_handler)
{
    struct sigaction action;
    memset(&action, 0, sizeof(action));
    action.sa_flags = SA_SIGINFO;
    action.sa_sigaction = signal_handler_action;
    return !sigaction(sigNumber, &action, NULL);
}

称之为:

installSignalHandler(SIGINT);
installSignalHandler(SIGTERM);

下一个代码将被执行:

static void signal_handler_action(int sig, siginfo_t *siginfo, void* content) 
{
    switch(sig) {
        case SIGHUP:
            break;
        case SIGUSR1:
            break;
        case SIGTERM:
            break;
        case SIGINT:
            break;
        case SIGPIPE:
            return;
    }
}

查看所需数据的siginfo_t结构

printf("Continue. Signo: %d - code: %d - value: %d - errno: %d - pid: %ld - uid: %ld - addr %p - status %d - band %d",
                      siginfo->si_signo, siginfo->si_code, siginfo->si_value, siginfo->si_errno, siginfo->si_pid, siginfo->si_uid, siginfo->si_addr,
                      siginfo->si_status, siginfo->si_band);