2016-04-05 4 views
0

je rencontre plusieurs fois où Linux Out of Memory chien de garde tueur sur Linux est tué mon application, cela est difficile à déboguer et à identifier ...C++ application sur linux, sur le crochet avant de tuer

Y at-il de toute façon en ac/Application C++ fonctionnant sous Linux pour imprimer un message avant que l'application ne soit détruite?

+0

Pas vraiment, mais vous pouvez attacher un débogueur ... 'sudo gdb -ex exécuter --args ./programme arg1 arg2 ...' – Siguza

+0

Comment est-il tué? SIGKILL immédiat? Que j'ai peur, il n'y a rien que vous pouvez faire, plutôt que de modifier votre application pour ne pas manger autant de mémoire. – SergeyA

+0

Une telle fonctionnalité irait à l'encontre de l'objectif du tueur OOM - ce serait un moyen d'éviter son action. –

Répondre

2

Si j'ai raison, le MOO enverra à votre processus un signal SIGTERM, afin que vous puissiez le gérer comme vous le souhaitez. Je n'avais pas raison, probablement OOM vous enverra SIGKILL et vous ne pouvez rien faire. Mais dans certaines circonstances, vous obtiendrez un SIGTERM avant.

(projet non testé)

#include <csignal> 
void signal_handler(int signal) { 
    // Your handling code here 
} 

int main() { 
    // Install handler (assign handler to signal) 
    std::signal(SIGINT, signal_handler); 
} 

C contrepartie:

#include<signal.h> 
#include<unistd.h> 

void signal_handler(int signo) 
{ 
    if (signo == SIGTERM) { 
    // your handling code 
    }   
} 

int main(void) 
{ 
    if (signal(SIGTERM, signal_handler) == SIG_ERR) { 
    printf("\nError installing handler\n"); 
    } 
    // Rest of your application 
} 

Soyez prudent lors de la manipulation des signaux, comme vous remplacez le comportement par défaut. Votre programme ne doit pas ignorer les signaux importants comme SIGTERM ou SIGINT: la fonction de gestion doit faire le travail de finition du programme ou peut-être appeler le gestionnaire d'origine. D'autre part, vous pouvez jouer avec: si vous êtes sûr que le problème est la mémoire allouée, vous pouvez essayer de libérer de l'espace inutilisé et essayer de continuer le travail (mais vous devez vous assurer que la raison du signal était) .

+2

IIRC, OOM envoie SIGKILL, et vous êtes mort. –

+1

@MartinJames D'après http://www.linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html?page=2, c'est SIGTERM. – user58697

+1

@ utilisateur58697 hmm. nous avons une divergence dans les documents disponibles :( –