Salut les gars. Mon programme utilise OpenMP à quelques parties pour faire du multithreading. Cela fonctionne pour la plupart, mais de temps en temps stalles et se trouve juste là. Donc, je le lance dans le débogueur, et je trouve la zone où il se bloque. Ensuite, j'essaie d'examiner les variables actuelles, et je reçois ceci:Déboguer du code multithread avec gdb mais pas d'accès aux variables privées?
169 if(0<=myPtr[3] && myPtr[3]<=1){//Reassign the velocities.
(gdb) print myPtr[3]
No symbol "myPtr" in current context.
Je ne sais pas pourquoi c'est. Je peux imprimer cela quand il n'y a qu'un seul thread. J'ai privatisé cette variable, et j'imagine que le programme ne sait pas de quel thread je parle quand je lui demande d'imprimer quelque chose (même si ce http://cc.jct.ac.il/cc-res/online-doc/gdb/gdb_26.html#SEC26 dit qu'il y aura toujours un fil courant ..?). Donc, si je choisis un seul thread, je reçois les mêmes choses:
(gdb) info threads
3 process 32970 thread 0x4203 0x90f9846e in __semwait_signal()
2 process 32970 thread 0x3007 0x90f9846e in __semwait_signal()
* 1 process 32970 local thread 0x2e03 mover3dsurfaces (.omp_data_i=0xbffff030) at mover3dsurfaces.cpp:174
(gdb) thread 1
[Switching to thread 1 (process 32970 local thread 0x2e03)]
mover3dsurfaces (.omp_data_i=0xbffff030) at mover3dsurfaces.cpp:174
174 partList.velocity(i,3) = velPtr[2];
(gdb) print velPtr[1]
No symbol "velPtr" in current context.
Je suis en fait un peu confus au sujet de cette partie. Ma machine n'a que deux processeurs. Comment peut-il y avoir 3 threads? Je vois que les deux nombres hexadécimaux juste avant __semwait_signal() sont les mêmes, mais je ne sais pas pourquoi ils sont séparés. Comment puis-je regarder les variables pour un seul thread?
Merci!
Version: mayer: ~ $ gdb declan de GNU gdb 6.3.50-20050815 (version Apple gdb-966) et je compile avec l'option -ggdb. Dans un programme de test, je l'ai fait en boucle en utilisant OpenMP et afficher le thread en cours à chaque itération. Il n'a engendré que deux boucles. Ici, je n'ai pas non plus précisé le nombre de threads à créer, alors pourquoi en choisir trois? Aussi, juste pour le répéter, je peux tout faire correctement quand ce n'est pas multithread. Je peux imprimer toutes les variables que je veux. – MasterZibZob