17

我正在尝试在 gdb 中的 linux 中为创建线程的程序设置断点。我想在线程创建时设置一个断点,但不幸pthread_create的是一个版本符号,我无法获得它的全名。

如果我输入:

catch thread_start

我明白了

Catch of thread_start not yet implemented

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

4

3 回答 3

19

好的,所以如果我不太了解你,或者我的第一个答案没有帮助,请执行以下操作:

(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。

于 2009-10-09T19:09:36.660 回答
18

试试这个:

(gdb) b __pthread_create_2_1

或者应用此补丁构建您自己GDB的。

GDB 或者在这里尝试最新的预发行版,这应该可以让你做"catch syscall clone"

于 2009-09-18T14:16:31.113 回答
3

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

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

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

现在,如果这不能为您解决问题,请继续我的第二个答案......

于 2009-10-09T19:06:32.923 回答