Question

Désolé je ne peux pas être précis avec le code, mais les problèmes que je vois sont anormaux. les valeurs de chaîne de caractères semblent se changer en fonction des autres, le code indépendant. Par exemple, la valeur de l'argument qui est passé autour ci-dessous simplement changer selon que je commente une ou deux des fprintf () appelle! Au dernier fprintf () la valeur est généralement complètement vide (et non, je l'ai vérifié que je ne suis pas en train de modifier directement l'argument ... tout ce que je dois faire est un commentaire fprintf () ou ajouter un autre fprintf () et la valeur de la chaîne changera à certains points):

static process_args(char *arg) {
    /* debug */
    fprintf(stderr, "Function arg is %s\n", arg);

    ...do a bunch of stuff including call another function that uses alloc()...

    /* debug */
    fprintf(stderr, "Function arg is now %s\n", arg);    
}

int main(int argc, char *argv[]) {
    char *my_arg;

    ... do a bunch of stuff ...

    /* just to show you it's nothing to do with the argv array */
    my_string = strdup(argv[1]);

    /* debug */
    fprintf(stderr, "Argument 1 is %s\n", my_string);

    process_args(my_string);
}

Il y a plus de code tout autour, donc je ne peux pas demander à quelqu'un de déboguer mon programme - ce que je veux savoir est comment puis-je déboguer pourquoi des chaînes de caractères comme celui-ci obtiennent leur mémoire modifiée ou remplacée à partir du code sans rapport. Est-ce ma mémoire limitée? Ma pile est trop petit? Comment puis-je dire? Que puis-je faire d'autre pour traquer la question? Mon programme n'est pas énorme, il est comme un millier de lignes de code ou donner de prendre et un couple lié dynamiquement libs externes, mais rien hors de l'ordinaire.

AIDE! TIA!

Était-ce utile?

La solution

simple:

  1. Apprendre à utiliser Valgrind , en particulier memcheck
  2. Apprendre à utiliser GDB , y compris des points de rupture et variable inspection
  3. La pratique rend parfait.

Cela devrait trier. Assurez-vous que vous compilez des bibliothèques avec l'option -g sur GCC, qui maintient les symboles de débogage afin que votre sortie de débogage plus de sens.

Autres conseils

Il y a deux cas à considérer:

  1. La variable arg change de valeur entre le début et la fin de process_args.
  2. Les séjours arg les mêmes, mais la chaîne elle pointe est modifiée.

Votre description et votre code ne fait pas de différence entre les deux, mais il est important de savoir lequel des deux est en fait le cas.

Cela révélera la réponse:

fprintf(stderr, "Function arg is %s (%p)\n", arg, (void *)arg);
... do bunch of stuff ...
fprintf(stderr, "Function arg is now %s (%p)\n", arg, (void *)arg);

Le plus souvent arg ne change pas (ce que vous avez 2 cas). Si oui, quelque chose corrompt la chaîne que vous avez alloué. Valgrind, déjà suggéré, mais disponible uniquement sous Linux, AIX et MacOSX, n'a 50:50 chance de trouver le problème. Ce que vous vraiment est un besoin GDB point d'observation: Définir point d'arrêt au début de process_args, une fois frappé, et faire (gdb) watch *(long*)arg continue. GDB cessera quand quelque chose écrit à *arg (il fait arrêter sur l'instruction suivante). Ensuite, utilisez la commande (gdb) where pour comprendre ce qui se passe.

Si vous avez réellement arg changer sa valeur (cas 1), qui peut être plus difficile à déboguer, et indique la corruption pile de quelque sorte, ou une violation de la procédure des conventions d'appel de votre plate-forme. Valgrind aidera probablement pas du tout cela. Ceci est plus cohérent avec le comportement que vous avez décrit. Commentant le code sans lien provoque le bug à changement

Je ne peux pas donner d'autres conseils sur le cas de débogage 1 si, puisque vous ne l'avez pas révélé ce que votre réelle plate-forme est.

Si vous écrivez des applications de niveau utilisateur, Valgrind est un bon choix pour détecter les problèmes de mémoire tels que les fuites de mémoire, débordement de tampon, etc. Voici un guide de démarrage rapide: http://valgrind.org/docs/manual/QuickStart.html

Vous ne donnez pas vos outils de dev, mais si vous êtes comme 90% des codeurs que vous utilisez déjà un IDE avec un débogueur qui peut gérer cela, pas de nouveaux outils requis. Régler une montre sur le morceau de mémoire contenant vos chaînes, puis étape dans votre code et voir quand les chaînes sont changés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top