pthread_create的上GDB断点(gdb breakpoint on pthread_cr

2019-07-18 10:12发布

我想设置在Linux中断点在gdb的程序创建线程。 我想设置线程创建一个断点,但不幸的是pthread_create是一个版本符号,我不能得到它的全名。

如果键入:

catch thread_start

我得到

Catch of thread_start not yet implemented

如何捕捉线程的创建在gdb这种情况​​的最好方法?

Answer 1:

试试这个:

(gdb) b __pthread_create_2_1

或者建立自己的GDB与此补丁适用。

或者试试最新的预发布GDB 在这里 ,它应该让你做"catch syscall clone"



Answer 2:

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

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



Answer 3:

OK,我要发布两个答案,因为我不知道如果我理解你的问题。

第一:在pthread_create是一个共享库,和gdb知道如何处理。 如果你只是说“pthread_create的突破”,应该“只是工作”。

你不应该需要知道这一点,但它应该工作的方式是,GDB会发现一个符号“@ pthread_create的PLT”,这是通向动态加载存根,并最终会被跳转代替,以适当的共享库函数。 我们将设置一个断点和gdb会自动与动态加载程序处理,直到最终达成(并停止)正确的共享库函数。

现在的情况下,不解决它适合你,在我的第二个答案...



文章来源: gdb breakpoint on pthread_create