如何在gdb调试多线程?
为什么调试时,只要其中一个线程退出后,gdb就无法再继续调试了呢?环境是solaris 9 intel,gcc 3.4.2,gdb 6.0,pthread,提示信息:sol_thread_fetch_registers: td_ta_map_id2thr: no thread can be found to satisfy query,请问有人碰到过这种情况吗?或者你们又是如何调试的呢? 问题点数:100、回复次数:8Top
1 楼gdhyj(gdhyj)回复于 2005-04-22 09:00:27 得分 0
关注,我也想知道如何在gdb里调试多线程;Top
2 楼gettext(冰雪之崖)回复于 2005-04-23 08:07:13 得分 5
(gdb) info threads
(gdb) threads #
Top
3 楼shajie(笨鸟先飞)回复于 2005-04-23 11:22:16 得分 5
GDB调子进程是调不了的吧
调主进城应该是可以设中断的,和调单进城程序一样嘛
子进程的东西只有打印出来才知道哦Top
4 楼sharkhuang(走吧走吧!人总会慢慢长大~)回复于 2005-04-23 14:53:17 得分 5
attach pidTop
5 楼cuptbluesky(苦行僧)回复于 2005-04-25 20:41:33 得分 0
谢谢,各位的关心,但是都没有解决我的问题。算了,我慢慢搞吧。
顺便再问一个问题:PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP这个宏是在那里定义的呢?我编译时怎么老报无定义呀,而且pthread.h里没有,是否有替换宏?Top
6 楼qfxx(秋风萧萧)回复于 2005-04-26 10:30:42 得分 85
我用的是rh linux9
/usr/include/pthread.h中有如下定义
# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
{0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, __LOCK_INITIALIZER}
对于多线程程序,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。
break <linespec> thread <threadno>
break <linespec> thread <threadno> if ...
linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。如果你不指定thread <threadno>则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如:
(gdb) break frik.c:13 thread 28 if bartab > lim
当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。
Top
7 楼cuptbluesky(苦行僧)回复于 2005-04-27 09:41:40 得分 0
非常感谢qfxx,我的solaris9的pthread.h确实没有PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 这个宏,但现在问题是PTHREAD_MUTEX_RECURSIVE_NP这个宏也没有,请问PTHREAD_MUTEX_RECURSIVE_NP跟PTHREAD_MUTEX_RECURSIVE是什么关系,又或者能否把你的PTHREAD_MUTEX_RECURSIVE_NP的定义贴出来呢?谢谢!Top
8 楼cuptbluesky(苦行僧)回复于 2005-04-27 11:22:26 得分 0
我在linux8下看了一下pthread.h,确实跟solaris9中的不同Top




