web-dev-qa-db-fra.com

GDB: pas de symbole "i" dans le contexte actuel

Lors du débogage d'un programme C dans GDB, j'ai un point d'arrêt dans A pour boucle. Je ne peux pas imprimer la valeur de "i" (je reçois: pas de symbole "i" dans le contexte actuel.). Je peux imprimer la valeur de toutes les autres variables. Est-ce normal?

Voici la boucle:

for (i=0; i < datasize; i++){  
    if ( feature_mask[i] > 0 ){  
        k = feature_mask[i] - 1;  
        if (neighbors[k][nmax-1] != 0){
            neighbors[k][nmax-1] = bvalue;  
            feature_mask[i] = -feature_mask[i];
        }
    }
}
23
Ben2209

Il a probablement été optimisé hors de votre code compilé car vous n'utilisez que feature_mask[i] dans la boucle.

Avez-vous spécifié un niveau d'optimisation lorsque vous avez appelé votre compilateur? Si vous utilisiez GCC, alors omettez simplement -O options et réessayez.

22
a'r

J'ai rencontré ce problème récemment. J'ai compilé GCC 5.1, puis l'a utilisé pour compiler une base de code C++ 11. Et, bien que je puisse passer à travers le code du programme dans gdb, je ne pouvais pas imprimer la valeur d'aucune variable, je n'ai conservé "aucun symbole" xyz "dans le contexte actuel", pour toutes variable.

J'utilisais GDB 7.4, mais la dernière version disponible à l'époque était de 7,9. J'ai téléchargé la dernière version de GDB et la compilée (à l'aide de GCC 5.1) et lorsque vous utilisez GDB 7.9, j'ai pu nouveau inspecter avec succès les valeurs variables.

Je suppose que les informations de débogage de GCC 5.1 sont incompatibles avec GDB 7.4.

23
dreamlax

Vous pouvez essayer de déclarer i comme volatile. Cela empêchera certaines optimisations du compilateur (et, espérons-le, rendra i visible à l'intérieur du débogueur).

3
pmg

Vérifiez vos options d'optimisation. Il est possible que la GCC puisse remplacer la variable avec un pointeur dans feature_mask.

2
Aaron Digulla