web-dev-qa-db-fra.com

débogage c ++: ../nptl/sysdeps/unix/sysv/linux/raise.c: aucun fichier ou répertoire de ce type

J'utilise gdb pour déboguer un programme C++. Dans la ligne

assert(prevId ==  GetTagIdFromState(maxState));
  • la valeur du paramètre prevId est 0;
  • la méthode GetTagIdFromState(maxState)returns 50;

lors du débogage, j'obtiens les erreurs suivantes.

Assertion `prevId == GetTagIdFromState(maxState)' failed.
Program received signal SIGABRT, Aborted.
0x00007ffff6ecbba5 in raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64    ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
      in ../nptl/sysdeps/unix/sysv/linux/raise.c
12
wangzhiju

Votre application fonctionne comme prévu. L'assertion échoue (puisque les valeurs que vous lui transmettez ne sont pas égales, la macro assert reçoit 0) et votre programme est donc en cours d'abandon. C'est comme ça que ça marche:

Si NDEBUG n'est pas défini, alors assert vérifie si son argument (qui doit avoir un type scalaire) est égal à zéro. Si tel est le cas, assert output fournit des informations de diagnostic spécifiques à l'implémentation sur la sortie d'erreur standard et appelle std :: abort .

l'accent mien.

Vérifiez cette référence d'assertion pour plus d'informations.

9
SingerOfTheFall

Cela devrait vous mettre au courant de l'utilisation de la fonction assert

void assert (int expression);

Evaluation de l'assertion Si l'expression de l'argument de cette macro de forme fonctionnelle est égale à zéro (c'est-à-dire si l'expression est fausse), un message est écrit sur le périphérique d'erreur standard et l'abandon est appelé, mettant fin à l'exécution du programme.

Les spécificités du message affiché dépendent de l’implémentation spécifique dans le compilateur, mais elles doivent inclure: l’expression dont l’assertion a échoué, le nom du fichier source et le numéro de ligne où cela s’est produit. Un format d'expression habituel est:

L'assertion a échoué: expression, fichier nom de fichier, numéro de ligne de ligne Cette macro est désactivée si, au moment d'inclure assert.h, une macro portant le nom NDEBUG a déjà été définie. Cela permet à un codeur d'inclure de nombreux appels d'assertion dans un code source lors du débogage du programme, puis de tous les désactiver pour la version de production en incluant simplement une ligne du type:

#define NDEBUG at the beginning of its code, before the inclusion of assert.h.

Par conséquent, cette macro est conçue pour capturer les erreurs de programmation, et non les erreurs d'utilisateur ou d'exécution, car elle est généralement désactivée après la sortie du programme de la phase de débogage. à partir de: C++ Ref

0
Alireza Soori

Je viens de rencontrer cette erreur en essayant de déboguer un programme sur un Raspberry Pi. Le programme utilise le GPIO de manière à ce qu'il soit exécuté en tant que root. Par exemple, je lance le programme que j'ai écrit comme ceci:

Sudo ./foo

J'ai oublié cela, cependant, lors du démarrage du débogueur, et j'ai essayé

gdb foo

Et j'ai eu l'erreur que vous semblez avoir rencontrée:

Program received signal SIGABRT, Aborted.
0x76cd0f70 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.

Quand je l'ai utilisé avec Sudo, cela a bien fonctionné.

Sudo gdb foo

J'espère que ça aide quelqu'un dans le même bateau.

0
Marvo