2017-10-19 5 views
1

J'utilise Qt5.9, une simple vérification:Qt SIGABRT message alternatif?

 assert(pobjNode != NULL); 

PROVOQUERONT la boîte de dialogue d'erreur du signal reçu Qt à afficher qui ne donne aucune information utile sur l'endroit où le problème est ou ce qu'elle est.

Existe-t-il un moyen de remplacer cette information inutile par quelque chose d'un peu plus utile? Ce à quoi je pense est un moyen de configurer la boîte de dialogue pour afficher ce qui pourrait être une erreur en cas d'erreur.

+0

Sur quel système d'exploitation? Pourquoi utiliser le débogueur 'gdb' n'est pas suffisant? –

+0

Ubuntu, je ne veux pas utiliser le débogueur pour tout ... c'est beaucoup plus facile de lancer une assertion et de lancer l'application. – SPlatten

Répondre

1

Q_ASSERT est une macro d'assertion personnalisée qui améliore la fonction standard assert. Le message d'erreur est géré par qFatal(), qui peut se comporter légèrement mieux sur certaines plates-formes que la macro standard assert. Par exemple, sur Windows, il déclenchera le débogueur Visual Studio au point où l'assertion échoue au lieu de simplement appeler abort().

Vous pouvez également rediriger la sortie des fonctions de message d'erreur Qt tels que qFatal à votre gestionnaire de message personnalisé (avec qInstallMessageHandler()). Cela peut être utile, par exemple, si vous voulez rediriger le message d'erreur vers un fichier.

Notez également que Q_ASSERT est désactivé avec la macro QT_NO_DEBUG (alors que assert est désactivé par NDEBUG): cela peut être utilisé pour séparer votre code lié entre affirme-Qt et le reste.

Q_ASSERT_X Imprime le message avec l'emplacement où, le nom du fichier source et le numéro de ligne si test est faux. Imprime le message avec l'emplacement où, le nom du fichier source et le numéro de ligne si test est faux. Exemple:

// File: div.cpp 
    #include <QtGlobal> 
    int divide(int a, int b) 
     { 
      Q_ASSERT_X(b != 0, "divide", "division by zero"); 
      return a/b; 
     } 

pour en savoir plus sur test and debug.

+0

en bas de la publication il y a un lien sur le test et le débogage des documents Qt, vous pouvez le lire et trouver de bonnes solutions de contournement. De toute façon, si vous voulez en savoir plus, faites le moi savoir – saeed

+0

hmmm .... Après avoir parcouru tout le code et remplacé les instances de assert avec Q_ASSERT_X, l'erreur affichée dans la boîte de dialogue n'est pas modifiée et reste aussi inutile que jamais. ... "signal reçu, l'inférieur s'est arrêté parce qu'il a reçu un signal du système d'exploitation." – SPlatten

+1

Si vous utilisez qt creator et gdb Outils goto-> options-> débogueur dans Gdb étendre l'onglet stop lorsque qFatal() est appelé – saeed

1

Vous pouvez définir votre propre macro MY_ASSERT. Sur Linux, il peut même appeler une autre fonction qui utilise Glibc backtrace functions ou la bibliothèque libbacktrace de Ian Taylor (à condition que votre code soit compilé avec DWARF informations de débogage en utilisant g++ -g) et peut-être afficher ces informations dans un dialogue modal, ou sur stderr. Cependant, il ne devrait probablement pas revenir. Lire aussi à propos de Qt and Unix signals et signal-safety(7). Cependant, assert détecte un bug que vous devez corriger Essayez d'éviter le code d'expédition avec de tels bogues de programmeur.

Sur Linux, l'habitude assert -c'est une macro définie dans /usr/include/assert.h - fera appel à l'échec __assert_fail (dans votre bibliothèque C, mais vous pouvez redéfinir vous-même) qui indirectement appel abort qui fait indirectement core dump que vous pouvez inspecter l'analyse post-mortem à l'aide du débogueur gdb. Vous avez seulement besoin d'activer les sauvegardes de base (en utilisant ulimit -c intégré dans votre terminal bash).

+0

Starynkevich sonne bien post +1, peut être utile sous Linux – saeed