2009-10-12 18 views
2

Quelle est la méthode la meilleure et la plus simple pour déboguer du code optimisé sous Unix écrit en C?Code optimisé sous Unix?

Parfois, nous n'avons également pas le code pour construire une bibliothèque non optimisée.

+0

Excellente question d'intégration. – whatnick

Répondre

3

C'est une très bonne question. J'ai eu des difficultés similaires dans le passé où j'ai dû intégrer des outils tiers dans mon application. D'après mon expérience, vous devez avoir au moins des callstacks significatives dans les fichiers de symboles associés. C'est simplement une liste d'adresses et de noms de fonctions associés. Ceux-ci sont habituellement enlevés et du binaire seul vous ne les obtiendrez pas ... Si vous avez ces fichiers de symboles, vous pouvez les charger en commençant gdb ou après en les ajoutant. Sinon, vous êtes bloqué au niveau de l'assemblage ...

Un comportement bizarre: même si vous avez le code source, il va sauter en avant et en arrière à des endroits où vous ne vous attendez pas (les instructions peuvent être réorganisées pour améliorer les performances) ou les variables n'existent plus (optimisées!), la définition de points d'arrêt dans les fonctions inlignées est inutile (elles ne sont pas présentes mais font partie de l'endroit où elles sont en ligne). Donc, même avec le code source, faites attention à ces pièges.

j'oublié de mentionner, le symbole fichiers ont généralement le .gdb d'extension, mais il peut être différent ...

0

Ecrire de petits échantillons de code par les mêmes interfaces (quelque chose dans son en-tête), et appelez vos échantillons au lieu de ce code optimisé, disons simulation, pour affiner la portée du code que vous déboguez. En outre, vous êtes en mesure de faire l'erreur d'autorisation dans vos échantillons.

+0

oui mais si elle comprend plusieurs centaines de fichiers c pour la construction d'un exécutable et je débogue ce executable.it serait mal de tête :( – Vijay

+0

la taille des échantillons (combien de lignes au total) est à vous, et maintenant vous pouvez juste utiliser debuger (ie gdb) parce que j'ai tout le code source – Test

2

Cette question n'est pas différente de "quelle est la meilleure façon de réparer une voiture de tourisme?" La meilleure façon de déboguer du code optimisé sous UNIX dépend exactement de l'UNIX dont vous disposez, des outils disponibles et du type de problème que vous essayez de déboguer.

Le débogage d'un plantage dans malloc est très différent du débogage d'un unresolved symbol at runtime.

Pour les techniques générales de débogage, je recommande ceci book.

Plusieurs choses vont rendre plus facile à déboguer au « niveau d'assemblage »:

  • Vous devez connaître les appeler convention pour votre plate-forme, de sorte que vous peut dire quelles valeurs sont transmises et retour Où trouver le pointeur this, dont les registres sont "sauvés par l'appelant" et qui sont "enregistrés", etc.
  • Vous devriez connaître la "convention d'appel" de votre système d'exploitation - à quoi ressemble un appel système le numéro de syscall entre, le premier paramètre, etc.
  • Vous devriez « maître » le débogueur: savoir comment trouver des fils, comment arrêter individuels threads, comment définir une conditionnelle point d'arrêt sur instruction individuelle, une seule étape, l'étape dans ou sauter les appels de fonction, etc.

Il est souvent utile de déboguer un programme de travail et un programme interrompu "en parallèle". Si la version 1.1 fonctionne et non la version 1.2, où divergent-ils par rapport à une API particulière?Démarrez les deux programmes sous le débogueur, définissez des points d'arrêt sur le même ensemble de fonctions, exécutez les deux programmes et observez les différences dans les points d'arrêt, et les paramètres qui sont passés.

+0

Je suis généralement confronté à des problèmes de crash et je travaille sur plate-forme AIX.Et dans mon environnement de travail, seul dbx est disponible.quelques fois il me montre des valeurs erronées de numéros de ligne et quelques fois je vois des valeurs de déchets de soem comme les arguments dans la fonction calls.this me confond beaucoup. – Vijay