2016-01-25 1 views
0

Dans un terminal linux, je tapé la commande pourquoi (cette commande n'existe pas), et a obtenu cette réponseQuels codes de sortie gdb renvoie-t-il lors de l'exécution de la ligne de programme suivante après avoir tapé la commande 'next'?

No command 'why'found, did you mean: 
.... 
why: command not found 

pour obtenir le code de sortie, ce que je tapais dans:

$? 

et a obtenu la réponse:

127: command not found 

Je suppose que lorsque la plupart des commandes sont exécutées, ils retournent les codes. Maintenant avec gdb, après qu'il exécute la ligne suivante du programme C en cours de débogage, est-ce qu'il renvoie des codes? Et si oui, comment puis-je obtenir ces codes (une commande comme $ dans gdb -? Je ne l'ai pas trouvé une documentation homme gdb pages d'une telle commande

* Dans tous les cas, gdb. devrait savoir (et probablement se connecter) si la ligne a été exécutée avec succès et sinon, ce qui s'est mal passé

+0

Lorsqu'un processus cible se termine, gdb stocke le code de sortie dans la variable de commodité '$ _exitcode'. Est-ce ce que vous cherchez? –

+0

Merci, c'était utile.Mais avant la fin du processus cible, "il n'y a qu'un changement d'état dans le programme" comme l'explique @dbush ci-dessous - qui répondait à ce que j'espérais recevoir dans la première partie de ma question – kosgei

Répondre

1

Une ligne de code ne s'exécute pas correctement, du moins pas de la même manière que les commandes données au shell.

Lorsque vous êtes sur le shell, vous entrez le nom d'une commande shell interne ou d'un programme externe Dans le cas d'un p externe rogram, la valeur de $? est la valeur transmise par le programme à l'appel système exit. Si le shell ne peut pas trouver un programme ou une commande avec ce nom, il vous donne le message d'erreur que vous avez décrit.

Dans un programme C compilé, aucun "code" n'est renvoyé après l'exécution d'une instruction. Il y a seulement un changement d'état dans le programme. Par exemple, si une instruction est i = i + 1;, la valeur de i est 1 supérieure à sa valeur avant l'exécution de l'instruction.

1

Les processus Unix renvoient toujours une valeur: leur code de sortie; nommé tel parce que la plupart des programmes se terminent par un appel à exit (il y a d'autres possibilités mais sans importance ici). Méfiez-vous que tous les processus renvoient un tel code, pas la plupart d'entre eux. Les shells interprètent les lignes tapées par l'utilisateur et les transforment en processus. Lorsqu'un processus se termine, le shel vous fait connaître la valeur du code de retour du dernier processus qu'il a contrôlé. En bash cette variable est $?. Si vous voulez l'imprimer, vous pouvez utiliser echo $?. Si vous tapez $?, il l'interprétera comme une commande mais 127 (la valeur de sortie de la dernière commande) n'est pas une commande. La norme est d'avoir une valeur de retour de 0 pour les processus correctement terminés, et toute valeur non nulle pour signaler qu'une erreur s'est produite quelque part dans la logique du programme. Gdb lance également des processus (pour les contrôler) mais, n'exécutant qu'une seule ligne de code, n'exécute pas de processus, il n'y a donc pas de code de sortie après l'exécution d'une étape d'un code de programme. Lorsque vous exécutez, dans gdb, quelque chose qui termine le processus, son code de sortie est disponible dans une variable gdb interne $_exitcode.

+0

Merci @ Jean-Baptiste. Merci de l'écho de _ $? _ Pour obtenir sa valeur plutôt que de laisser le shell utiliser sa valeur comme une commande lorsqu'il est utilisé sans l'écho. J'ai supervisé ça, merci. – kosgei