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
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.
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.
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".
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.