2010-12-04 52 views
2

J'écris un compilateur sparc. Un de mes cas de test fonctionne correctement lorsqu'il est exécuté à partir de la ligne de commande normalement, mais segfaults lorsque je redirige la sortie vers un fichier.Quelle est la meilleure façon de déboguer un segfault dans mon assembly SPARC?

J'ai essayé d'utiliser GDB mais c'est difficile avec l'assemblage. Comment puis-je comprendre quelque chose d'aussi simple que la ligne d'assemblage qui provoque le segfault?

Répondre

3

Malheureusement GDB est vraiment le meilleur moyen de déboguer des problèmes au niveau de la machine dans UnixSPARCs, ce qui est plutôt triste. La chose de base à comprendre est qu'un segfault est une sorte d'exception, et les exceptions provoquent l'effraction du programme dans le débogueur, si un est joint. Ils le font afin que vous puissiez examiner l'état des registres du processeur et de la mémoire au moment du crash.

Vous devez consulter le registre du compteur d'instructions (% ip). Cela contiendra l'adresse de la dernière instruction à exécuter, qui est l'instruction qui a déclenché la segfault. Ce sera une opération de chargement ou de stockage, vous pouvez donc regarder quel registre contient son adresse mémoire de source/destination, et comprendre pourquoi cette adresse est mauvaise (généralement c'est NULL, ou un numéro de poubelle qui n'est pas une adresse valide).

L'autre chose que vous pouvez faire est de compiler votre processus pour émettre un vidage de base quand il échoue, ce qui écrira un instantané de l'état du programme au moment où il est mort comme un gros fichier sur le disque. Malheureusement, le programme utilisé pour lire les vidages de base est ... gdb.