嘿傢伙。我的程序在幾個部分使用OpenMP來執行多線程。它適用於大部分,但偶爾會攤位,只是坐在那裏。所以我在調試器中運行它,並且找到它正在拖延的區域。然後我嘗試檢查當前的變量,我得到這個:用gdb調試多線程代碼但不能訪問私有變量?
169 if(0<=myPtr[3] && myPtr[3]<=1){//Reassign the velocities.
(gdb) print myPtr[3]
No symbol "myPtr" in current context.
我不知道這是爲什麼。當它只有單線程時,我可以打印它。我私有化了這個變量,並且我想象程序不會知道當我要求它打印什麼的時候我指的是哪個線程(即使這個http://cc.jct.ac.il/cc-res/online-doc/gdb/gdb_26.html#SEC26說總會有一個當前線程..?)。所以,如果我選擇一個線程,我得到相同的東西:
(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.
我實際上有點困惑這部分。我的機器只有兩個處理器。如何有3個線程?我發現__semwait_signal()之前的兩個十六進制數字是相同的,但我不知道它們爲什麼會分裂。我如何查看單個線程的變量?
謝謝!
版本:邁耶:戴克瀾〜$ GDB -v GNU GDB 6.3.50-20050815(蘋果版GDB-966) 和我用選項-ggdb編譯。在一個測試程序中,我使用OpenMP進行循環,並顯示每個迭代所在的當前線程。它只產生了兩個循環。在這裏,我也沒有指定要創建的線程數,那麼爲什麼要選擇三個呢?另外,僅僅爲了重申,當它不是多線程時,我可以做的很好。我可以打印任何我想要的變量。 – MasterZibZob 2010-08-13 00:51:57