2010-08-12 77 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。出于某种原因,没有任何问题的打印共享变量也是全局变量(??)