7
votes

Printf () avant la ligne provoquant la défaillance de la segmentation ne s'exécute pas

Lorsqu'un défaut de segmentation se produit, le printf () avant qu'il ne s'exécute pas.

main()
{
 printf( "something" );
 statement;  //this statement causes a segmentation fault
}

c gcc

0 commentaires

3 Réponses :


12
votes

Assurez-vous d'inclure une nouvelle ligne "\ n" dans votre instruction PrintF. Normalement, au moins dans les systèmes UNIX, stdout est tamponné de la ligne que le caractère de nouvelle ligne rend la ligne à apparaître immédiatement. Vous avez probablement omis "\ n" (ou votre sortie n'est pas rincé pour une autre raison) et c'est pourquoi vous ne pouvez pas voir la chaîne imprimée.

Une autre option consiste à rincer la sortie vous-même à l'aide de fflush (stdout) après avoir appelé printf .


2 commentaires

Il fait pour la sortie de la ligne tamponnée


@ M.32 - Si vous redirigez votre sortie dans un fichier, le truc de tampon de ligne ne fonctionnera pas. Il suffit d'utiliser fflush () - il est portable et cohérent.



10
votes

Un flux de sortie peut ne pas être émis avant un crash de programme, mais vous pouvez forcer les octets à produire en les flushing avec fflush ().

Je le fais habituellement avec quelque chose comme ceci: P>

if (trace) { fflush(stdout); }


5 commentaires

"Trace" est quelque chose de spécial .. ?? ou vous venez de détecter la défaillance de la segmentation.?


@ M.32 - J'ai pris son Trace pour être une variable qu'il configurée lors d'une init, peut-être d'une option de ligne de commande.


Alternativement, fprintf à starr .


@Davidthornley non, tout en envoyant à stardr, c'est une bonne chose à faire, il serait toujours rattrapé et éventuellement non envoyé; Ce quicule est dit au système de rincer les écrivies en attente - obtenez-les! Ainsi, Fprintf à Stdrr aurait le même comportement que l'appel précédent.


stardr est absorbé par défaut, même s'il est redirigé vers un fichier. Il n'a jamais besoin de rinçage manuel après que l'IO l'appelait.



2
votes

sortie via printf () et toute autre fonction d'E / S standard est tamponnée dans la bibliothèque C standard C.

Vous devez appeler fflush () pour vous assurer que la sortie est envoyée au TTY avant que votre programme ne se bloque.


1 commentaires

Intéressant non motif -1, quelqu'un.