pthread_create上的gdb断点

时间:2009-09-17 18:43:59

标签: gcc gdb multithreading breakpoints

我试图在gdb中为一个创建线程的程序在linux中设置一个断点。我想在线程创建时设置一个断点,但遗憾的是pthread_create是一个版本化的符号,我无法得到它的全名。

如果我输入:

catch thread_start

我得到了

Catch of thread_start not yet implemented

在这种情况下,如何在gdb中捕获线程创建的最佳方法是什么?

3 个答案:

答案 0 :(得分:16)

试试这个:

(gdb) b __pthread_create_2_1

或者在申请this patch的情况下构建自己的GDB

或者试用最新的预发布GDB here,这样您就可以"catch syscall clone"

答案 1 :(得分:16)

好的,如果我不是真的了解你,或者我的第一个答案没有帮助,请这样做:

(gdb) info func pthread_create
All functions matching regular expression "pthread_create":

Non-debugging symbols:
0x080485e0  pthread_create
0x080485e0  pthread_create@plt
0x00786590  __pthread_create_2_1
0x00786590  pthread_create@@GLIBC_2.1
0x00786ee0  __pthread_create_2_0
0x00786ee0  pthread_create@GLIBC_2.0

现在选择您认为正确的符号,并在那里设置断点。 不要选择那些带有“@”的,但其中一个有数字 和下划线,例如1__pthread_create_2_1。

答案 2 :(得分:2)

好的,我要发两个答案,因为我不确定我是否理解你的问题。

首先:pthread_create位于共享库中,gdb知道如何处理它。 如果你只是说“打破pthread_create”,它应该“正常工作”。

你不应该知道这一点,但它的工作方式是gdb 会找到一个符号“pthread_create @ plt”,这是一个导致的存根 动态加载器,最终会被跳转到 适当的共享库功能。我们将在那里设置一个断点, 并且gdb将自动处理动态加载器,直到最终 到达(并停在)正确的共享库函数。

现在万一没有为你解决,我的第二个回答......