使用gdb调试多线程代码但无法访问私有变量?

时间:2010-08-12 22:25:12

标签: c++ multithreading gdb openmp

嘿伙计们。我的程序在几个部分使用OpenMP来进行多线程处理。它在很大程度上起作用,但偶尔会失速并且只是坐在那里。所以我在调试器中运行它,然后找到它停止的区域。然后我尝试检查当前变量,我得到了这个:

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()之前的两个十六进制数字是相同的,但我不知道为什么它们被拆分了。如何查看单个线程的变量?

谢谢!

3 个答案:

答案 0 :(得分:3)

如果你还没有解决这个问题......

我遇到了同样的问题,并在使用g ++编译时使用-gstabs +(而不仅仅是-g)选项解决了这个问题。

然而,在尝试打印共享变量时,我仍然在当前上下文中获得“无符号”var“。由于某种原因,打印共享变量(也是全局变量(??)

没有问题

答案 1 :(得分:2)

  

我的机器只有两个处理器。   怎么会有3个线程?

线程数与(真实或虚拟(AKA超线程)CPU核心数量无关)。 您可以拥有(几乎)任意数量的线程(仅限于操作系统)。操作系统的调度程序负责以公平的方式将CPU时间分配给线程 - 并唤醒休眠线程,如果有新的东西(阻塞I / O完成,套接字上的新数据等)。

关于“未找到符号” - 问题:是否有完整或仅有限的调试信息? (您使用了什么-g选项?)以及哪个gdb版本? 可能会发生变量或指针“优化”并保存在寄存器中。然后gdb无法显示变量的值。但是,我使用的所有gdb版本仍然知道符号存在,但不能给出值(它显示消息“值优化了”)。

答案 2 :(得分:0)

我有时也注意到了这一点。但我通常通过执行print *this来解决当前对象的内容(假设velPtr在当前对象中)。

我也想学习最终的答案,但这种解决方法可能会帮助你。