IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Segmentation Fault (async ?)


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut Segmentation Fault (hash ?)
    Bonjour,

    Je rencontre depuis peu une erreur pour le peu étrange :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ~$ perl5.10.1 run.pl
    Loading conf from /usr/opt/caacrinolas2/caacrinolas.cfg
    :card.freenode.net NOTICE * :*** Looking up your hostname...
    :card.freenode.net NOTICE * :*** Checking Ident
    zsh: segmentation fault  perl5.10.1 run.pl
    run.pl ne contient que ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/usr/bin/perl
     
    use BotIRC;
     
    $bot = new BotIRC();
    $bot->loadConf();
    $bot->init();
    Et voici la portion de code qui semble causer problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    # Lance le bot
    sub init {
        my ($self) = @_;
        $sock = IO::Socket::INET->new(
                        PeerHost => "$self->{server}",
                        PeerPort => $self->{port},
                        Proto => "tcp" ) or die "could not make the connection: $!";
     
        binmode($sock, ":encoding(iso-8859-15)");
     
        while ($line = <$sock>) {
            print $line;
            if($line =~ /.*\*\*\*.*(checking ident)/i){
                print $sock "NICK $self->{nick}\nUSER $self->{conf}->{ident} 0 0 :just a bot\n";
                last;
            }
        }
     
        while ($line = <$sock>) {
            # Si le serveur nous ping, on repond
            if($line =~ /^PING/){
                print $sock "PONG :" . (split(/ :/, $line))[1];
            }
            if($line =~ /(376|422)/i){
                print $sock "NICKSERV :identify $self->{conf}->{pwd}\r\n";
                last;
            }
        }
     
        sleep 3;
        $self->connect();
    }
     
    sub connect {
        my ($self) = @_;
        $controls{ping} = async { $self->ping(); };
        foreach (split(';',$self->{chan})) {
            print $sock "JOIN $_\r\n";
            $self->listen($_);
        }
    }
    C'est même plus spécifiquement cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $controls{ping} = async { $self->ping(); };
    Pourtant, tout fonctionnait. (J'ai apporté 2-3 modifs au reste du code, mais je n'ai pas touché aux threads).

    Quelqu'un a-t-il déjà rencontré ce problème ? Quelle serait la solution ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Je viens de tester ce petit bout de script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use threads;
    use threads::shared;
     
    $| = 1;
    my %blah = ();
     
    $blah{blih} = async {
        print "toto\n";
        sleep 2;
        print "tata\n";
    };
     
    $blah{bloh} = async {
        print "titi\n";
        sleep 5;
        print "tutu\n";
    };
     
    while ( my ($key,$val) = each(%blah) ) {
        print "waiting \$blah{$key}...";
        $blah{$key}->join();
        print " done.\n";
    }
    Et ça fonctionne... Alors que dans mon module, l'appel à async crash.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    J'ai continué mes investigations, et il semblerait que le problème vienne des tables de hashage...

    Quelqu'un a-t-il déjà été confronté à cette situation ? Quelle serait l'éventuelle solution ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    J'ai pu avancer dans mes recherches. La "deuxième" erreur (sur les hashs) semble se produire sur un noyau para-virtualisé (via Xen) en 64bits. Sur un noyau 686 para-virtualisé je n'ai plus ce problème.

    Pour ce qui est des threads qui provoquent un segfault, c'est du au fait que j'utilise le module Encode qui n'est pas thread-safe.

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo