web-dev-qa-db-fra.com

lldb: impossible de se matérialiser: impossible d'obtenir la valeur de la variable

J'ai compilé un fichier cpp avec cette ligne de commande: g++ -g test.cpp

Il lève une exception à la ligne 28. Je veux rechercher la cause en inspectant les variables dans lldb. J'ai défini un point d'arrêt à la ligne 28 et exécuté le a.out Dans lldb.

(lldb) n
Process 84233 stopped
* thread #1: tid = 0xa44b86, 0x00000001000017fb a.out`say(s=<unavailable>) + 987 at so.cpp:28, queue = 'com.Apple.main-thread', stop reason = step over
    frame #0: 0x00000001000017fb a.out`say(s=<unavailable>) + 987 at so.cpp:28
   25       }
   26       else{
   27           s.insert(0, to_string(sz));
-> 28           s.erase(2, sz-1);
   29       }
   30       return s;
   31   }
(lldb) po s
error: Couldn't materialize: couldn't get the value of variable s: variable not available
Errored out in Execute, couldn't PrepareToExecuteJITExpression

Pourquoi le message d'erreur? Comment puis-je inspecter la variable s?

version lldb: lldb-320.4.115.3

version g ++: Configured with: --prefix=/Applications/Xcode6-Beta5.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 6.0 (clang-600.0.45.3) (based on LLVM 3.5svn) Target: x86_64-Apple-darwin13.3.0 Thread model: posix

29
Anthony Kong

Cette erreur signifie que les informations de débogage mentionnent la variable, mais indiquent qu'elle n'a pas d'emplacement de stockage sur le PC actuel.

Cela peut être dû au fait que la variable a été optimisée (peu probable étant donné que vous appelez simplement une fonction sur la variable) ou parce que le compilateur a ignoré les informations de débogage de la variable et perdu la trace de son emplacement.

Assurez-vous que vous compilez le code que vous essayez de déboguer à -O0 car il n'y a pas beaucoup de compilateurs qui émettent de bonnes informations de débogage à des niveaux d'optimisation plus élevés. Si vous compilez à -O0, il s'agit d'un bogue du compilateur. Vous devriez probablement le signaler aux gens de gcc. Vous pourriez voir si vous avez plus de chance avec Clang. Sinon, vous devez lire l'assembly de la fonction pour déterminer où se trouve réellement la variable, puis dire au débogueur d'imprimer l'adresse correctement convertie.

21
Jim Ingham

J'ai eu ce problème lorsque j'ai activé le "Sanitizer d'adresse" de mon schéma d'application. Désactiver, il a résolu le problème.

12
jomafer

Je vois cela lorsque j'exécute une version RELEASE (vs une version DEBUG) (Product-> Scheme ...-> Edit Scheme ...-> Info, puis définissez Build Configuration sur "Debug".

11
DustinB

J'ai eu ce problème lors de la compilation avec l'indicateur -Og. Pour une raison quelconque, je pensais que cela signifiait "optimiser pour le débogage". Je ne pense pas que ce soit le cas en réalité. La suppression de ce drapeau a résolu le problème pour moi.

0
Hastradamus