2010-07-23 10 views
0

Je souhaite utiliser clone pour consigner l'état actuel de mon programme. Il a beaucoup de boucles et je veux garder une trace du processus sans imprimer l'état dans chaque itération de la boucle.en utilisant clone(): erreur de segmentation

Voilà pourquoi j'ai créé cette preuve de concept:

#include <iostream> 
#include <cstdlib> 

unsigned int i; 

int log(void*) { 
    std::cout << "LOGGING START" << std::endl; 
    while(true) { 
    sleep(1); 
    std::cout << i << std::endl; 
    } 
} 

int main() { 
    void **child_stack = (void**)malloc(16384); 
    i = 0; 

    std::clog << "calling clone" << std::endl; 
    clone(log, child_stack, CLONE_VM | CLONE_FILES, NULL); 
    std::clog << "done" << std::endl; 

    while(true) { 
    ++i; 
    } 

    return 0; 
} 

Quand je lance sans gdb il se bloque avec une erreur de segmentation au clone() mais il fonctionne très bien si j'utilise gdb. Pourquoi?

Pensez-vous que c'est une bonne pratique ou vais-je rencontrer des problèmes tôt ou tard? Et y a-t-il une meilleure méthode pour y parvenir?

Cheers,

Manuel

Répondre

1

L'argument de la pile à clone est un void* simple. En outre, la pile se développe sur la plupart des architectures, donc le pointeur de la pile doit pointer vers l'extrémité de la mémoire allouée.

Dans tous les cas, vous ne devez pas utiliser directement clone sauf si vous avez vraiment besoin d'éviter toute dépendance aux bibliothèques externes. Utilisez plutôt la bibliothèque pthreads. Il fournit une API beaucoup plus facile (et plus sûre).

+0

pthreads est également plus portable; 'clone' est spécifique à Linux. –

+0

Ok, mais alors je devrais créer un mutex et le verrouiller au début de l'itération de la boucle for et le débloquer à la fin? Si oui, cela je pense que cela nuirait à la performance. – Manuel

+0

J'ai essayé de l'utiliser, mais la performance se décompose vraiment fortement. Y a-t-il une autre solution? – Manuel

0

Sur les processeurs Intel, l'argument child_stack doit pointer vers le haut de la pile, pas vers le bas.

Quoi qu'il en soit, je pense que l'utilisation de clone n'est pas une bonne idée. Il existe environ trois façons d'appeler clone, en fonction de l'architecture, tous mal documentés. Je suggère d'utiliser la bibliothèque pthreads (ou, puisque nous sommes en C++, Boost.Threads).