2011-09-29 101 views
1

我有一个C程序,其中主函数创建线程,我必须调试一个线程。我正在使用gdb。但是我不能在这个程序的特定C文件上“破解”或“监视”变量。例如。我的线程6被编程并使用某些C文件,并且我必须在601行上说call_connect.c。这不可能吗?如果我尝试,这是发生了什么:GDB与pthreads

(gdb) info threads 
    6 Thread 0xb5c96b70 (LWP 3608) 0xb7fe1424 in __kernel_vsyscall() 
    5 Thread 0xb6497b70 (LWP 3607) 0xb7fe1424 in __kernel_vsyscall() 
    4 Thread 0xb6c98b70 (LWP 3606) 0xb7fe1424 in __kernel_vsyscall() 
    3 Thread 0xb7499b70 (LWP 3605) 0xb7fe1424 in __kernel_vsyscall() 
    2 Thread 0xb7c9ab70 (LWP 3604) 0xb7fe1424 in __kernel_vsyscall() 
* 1 Thread 0xb7c9b6c0 (LWP 3603) 0x0804a178 in main() 

(gdb) break 601 thread 6 
No line 601 in file "events.c". 

(gdb) break call_connect.c:601 thread 6 
No source file named call_connect.c. 

而且我调试我的C代码-O0 -ggdb和我仍然无法观察变量。 这是我在阅读char * ptext变量时得到的结果。

(gdb) print ptext 
No symbol "ptext" in current context. 
(gdb) watch ptext 
No symbol "ptext" in current context. 

有人可以帮忙吗?

回答

3

虽然我还没有广泛使用gdbpthreads但我有几个你可能会尝试的指针。

  1. 您可以切换到你想要使用thread threadnum其中threadnum是id(第一列)通过info threads显示调试线程。

  2. 检查正在查找的文件usinf show directories命令的源目录。如果您的源所在的目录不在列表中,通过directory <path_to_source>命令

  3. 添加它虽然设置断点或手表的自动完成(通常<Tab>)寻找断点和手表,你可以设置。

请检查下线程调试中YoLinux pthreads Tutorials部分获取更多详细信息的链接。

希望这会有所帮助!

0

你的问题是你的程序编译时没有调试信息。

最可能的原因:要么call_connect.c未经-ggdb标志,尽管你已经声称什么编译(检查您的构建日志以验证),或者你有你的链接线“流浪” -s(这将剥离可执行文件) 。

+0

当然,'gdb'会告诉你,一旦你装载了二进制文件,它是否找不到调试符号......?这不是一种快速验证二进制文件是否包含调试符号的方法吗? –

+1

GDB * *会正确地告诉你。你觉得'没有名为call_connect.c'的源文件是什么意思? –