Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/02/2015, à 16:00

dva2tlse

segfault introuvable [RéSOLU]

J'ai un programme qui tourne et envoie des sorties de contrôle vers stdout; elles ne s'affichent qu'avec un certain retard par rapport au point d'exécution auquel en est réellement le programme.
Mais j'ai l'impression que si une erreur intervient, elle est signalée immédiatement, sans attendre que les sorties déjà générées mais pas encore affichées ne le soient. Ce qui fait me semble-t'il, que la segfault signalée se retrouve à l'écran au beau milieu de sorties parfaitement normales générées préalablement, et qui étaient en train d'arriver à l'affichage au moment ou s'est produit la segfault.
Est-ce réaliste comme comportement ?
Y aurait il un moyen de synchroniser l'affichage normal et l'affichage des problèmes.
Je m'aperçois en écrivant ceci, qu'on pourrait imaginer que ça voudrait dire que stdout est bufferisé alors que stderr est direct.
Comment puis je faire pour trouver ma segfault (j'utilise déjà gdb, qui me dit à quelle ligne ça plante, mais ce message est affiché au milieu de sorties normales)
Merci,
David

Dernière modification par dva2tlse (Le 10/02/2015, à 08:30)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#2 Le 09/02/2015, à 18:26

claudius01

Re : segfault introuvable [RéSOLU]

dva2tlse a écrit :

... Je m'aperçois en écrivant ceci, qu'on pourrait imaginer que ça voudrait dire que stdout est bufferisé alors que stderr est direct.

Les 2 flux stdout et stderr sont bufférisés.
Maintenant, si l'un et l'autre ne sont pas "corrélés" (l'effet parvenant avant la cause dans ton cas si j'ai bien compris), c'est que l'un est flushé avant l'autre (le flush étant provoqué par le buffer de sortie plein ou un caractère '\n' dans le flux de sortie ou l'appel à la méthode flush() pour le flux en question.
Comme il est déconseillé de flusher pour des raisons de performances ou alors de façon bien contrôlée, une solution consisterait, sauf erreur de ma part, à rediriger stderr vers stdout au lancement du programme (2>&1 "programme_à_exécuter").

Hors ligne

#3 Le 09/02/2015, à 19:09

dva2tlse

Re : segfault introuvable [RéSOLU]

Ouais super; c'est exactement ça.
Je n'aurais jamais imaginé qu'on pouvait utiliser la redirection ainsi, mais ça semble être exactement ce qu'il me semble que j'aie besoin; mon exécutable s'appelle S (comme esSai) dans le répertoire où je travaille, et je le lance ordinairement avec ses arguments par :
$ ./S p2srfd05 el05.inp
Donc si j'ai bien compris, alors que je n'ai jamais vu ni utilisé de redirections précédant l'exécutable  (mébon YOUPI, je me coucherai moins ignare ce soir) ça devrait donner :
$ 2>&1 ./S p2srfd05 el05.inp
(ou avec des guillemets :    $ 2>&1 "./S p2srfd05 el05.inp";    pas forcément très utiles)

Et pour utiliser gdb je faisais
$ gdb ./S < RUN5A
ou RUN5A est un fichier de quelques lignes qui permet de passer les arguments et les commandes à gdb, avec :
        run p2srfd05 el05.inp
        bt
        q
        y
mais là, je ne sais pas trop où placer la redirection de stderr sur stdout.

  M'enfin j'essaierai ça demain au boulot puisque là je suis chez moi avec mon PC neurasthénique, alors que c'est pour un gigantesque boulot qui tourne 16 heures sur une red hat à 19 coeurs.
merci et à demain,
bonsoir et merci encore,
David

Dernière modification par dva2tlse (Le 09/02/2015, à 22:31)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#4 Le 10/02/2015, à 08:28

dva2tlse

Re : segfault introuvable [RéSOLU]

Bonjour claudius,
bon hébin bravo; je n'ai pas encore tout qui marche comme sur des roulettes, mais je sais ce qui patine; une initialisation de variable que je suspectais de temps à autres sans en avoir de preuve absolue, et maintenant je sais avec certitude que cette variable sert d'adresse et amenait une gamelle quand elle n'était pas encore définie.
Grand, grand, grand merci.
David


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne