我的程序被“杀死”

可能由内核提出这个问题 。 我想看看为什么我遇害了,就像刺杀发生的function一样。 🙂

此外,有什么我可以做的,让我的程序正常执行?


编年史

我的程序正确执行。 但是,我们遇到了一个大的数据集,1.000.000 x 960浮点数,我的笔记本电脑在家里std::bad_alloc()std::bad_alloc() )。

现在,我正在实验室中,处理器为3.00GHz×4的9.8吉比特的桌面,拥有超过家用笔记本电脑两倍的内存。

在家里,数据集不能被加载到存储数据的std::vector中。 在这里,在实验室里,这个工作已经完成,程序继续build立数据结构。

那是我最后一次听到的:

 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 +++ 

所以这个告诉我们,我我已经没有了记忆。

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

这意味着你正在分配(无开销) 3 840 000 000字节的数据。

或大约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位构建..

所以,如果你有另一个大的载体分配… …烧伤屁股烧伤

首先安装信号处理程序

 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);