2010-08-12 73 views
1

嘿傢伙。我的程序在幾個部分使用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()之前的兩個十六進制數字是相同的,但我不知道它們爲什麼會分裂。我如何查看單個線程的變量?

謝謝!

回答

2

我的機器只有兩個處理器。 怎麼可能有3個線程?

線程的數量無關(真實或虛擬的(AKA超線程)的CPU內核的數量。 如你願意,你可以有(幾乎)一樣多線程(僅受操作系統限制)。 OS的調度程序負責以公平的方式將CPU時間分配給線程,並喚醒睡眠線程,如果有新的東西(阻止I/O完成,插座上有新的數據等)。

關於你的「找不到符號」 - 問題:有沒有完整的或只有有限的調試信息可用?(你使用什麼-g選項?)和哪個gdb版本?可能發生變量或指針可以「優化」 「並保持在一個重新gister。然後gdb不能顯示變量的值。然而,我使用的所有gdb版本仍然知道該符號存在,但不能給出值(它顯示一條消息「value optimized out」)。

+0

版本:邁耶:戴克瀾〜$ GDB -v GNU GDB 6.3.50-20050815(蘋果版GDB-966) 和我用選項-ggdb編譯。在一個測試程序中,我使用OpenMP進行循環,並顯示每個迭代所在的當前線程。它只產生了兩個循環。在這裏,我也沒有指定要創建的線程數,那麼爲什麼要選擇三個呢?另外,僅僅爲了重申,當它不是多線程時,我可以做的很好。我可以打印任何我想要的變量。 – MasterZibZob 2010-08-13 00:51:57

0

我有時也注意到了這一點。但是我通常通過執行print *this來轉儲當前對象的內容(假設velPtr位於當前對象中)。

我想了解最終答案,但此解決方法可能同時對您有所幫助。

+0

謝謝。我實際上一直在使用這一點,它很有用。但是,究竟是什麼! – MasterZibZob 2010-08-17 18:33:35

3

如果您還沒有解決這個尚未...

我有同樣的問題,並使用-gstabs +(而不是僅僅-g)與G編譯時選項++解決它。

但是,當試圖打印共享變量時,我仍然在當前上下文中得到「無符號」var。出於某種原因,沒有任何問題的打印共享變量也是全局變量(??)