我想设置在Linux中断点在gdb的程序创建线程。 我想设置线程创建一个断点,但不幸的是pthread_create
是一个版本符号,我不能得到它的全名。
如果键入:
catch thread_start
我得到
Catch of thread_start not yet implemented
如何捕捉线程的创建在gdb这种情况的最好方法?
我想设置在Linux中断点在gdb的程序创建线程。 我想设置线程创建一个断点,但不幸的是pthread_create
是一个版本符号,我不能得到它的全名。
如果键入:
catch thread_start
我得到
Catch of thread_start not yet implemented
如何捕捉线程的创建在gdb这种情况的最好方法?
试试这个:
(gdb) b __pthread_create_2_1
或者建立自己的GDB
与此补丁适用。
或者试试最新的预发布GDB
在这里 ,它应该让你做"catch syscall clone"
好了,万一我真的不理解你,或者我的第一个答案是没有帮助的,这样做:
(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之一。
OK,我要发布两个答案,因为我不知道如果我理解你的问题。
第一:在pthread_create是一个共享库,和gdb知道如何处理。 如果你只是说“pthread_create的突破”,应该“只是工作”。
你不应该需要知道这一点,但它应该工作的方式是,GDB会发现一个符号“@ pthread_create的PLT”,这是通向动态加载存根,并最终会被跳转代替,以适当的共享库函数。 我们将设置一个断点和gdb会自动与动态加载程序处理,直到最终达成(并停止)正确的共享库函数。
现在的情况下,不解决它适合你,在我的第二个答案...