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()之前的两个十六进制数字是相同的,但我不知道为什么它们被拆分了。如何查看单个线程的变量?
谢谢!
答案 0 :(得分:3)
如果你还没有解决这个问题......
我遇到了同样的问题,并在使用g ++编译时使用-gstabs +(而不仅仅是-g)选项解决了这个问题。
然而,在尝试打印共享变量时,我仍然在当前上下文中获得“无符号”var“。由于某种原因,打印共享变量(也是全局变量(??)
没有问题答案 1 :(得分:2)
我的机器只有两个处理器。 怎么会有3个线程?
线程数与(真实或虚拟(AKA超线程)CPU核心数量无关)。 您可以拥有(几乎)任意数量的线程(仅限于操作系统)。操作系统的调度程序负责以公平的方式将CPU时间分配给线程 - 并唤醒休眠线程,如果有新的东西(阻塞I / O完成,套接字上的新数据等)。
关于“未找到符号” - 问题:是否有完整或仅有限的调试信息? (您使用了什么-g选项?)以及哪个gdb版本? 可能会发生变量或指针“优化”并保存在寄存器中。然后gdb无法显示变量的值。但是,我使用的所有gdb版本仍然知道符号存在,但不能给出值(它显示消息“值优化了”)。
答案 2 :(得分:0)
我有时也注意到了这一点。但我通常通过执行print *this
来解决当前对象的内容(假设velPtr在当前对象中)。
我也想学习最终的答案,但这种解决方法可能会帮助你。