我试图在gdb中为一个创建线程的程序在linux中设置一个断点。我想在线程创建时设置一个断点,但遗憾的是pthread_create
是一个版本化的符号,我无法得到它的全名。
如果我输入:
catch thread_start
我得到了
Catch of thread_start not yet implemented
在这种情况下,如何在gdb中捕获线程创建的最佳方法是什么?
答案 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将自动处理动态加载器,直到最终 到达(并停在)正确的共享库函数。
现在万一没有为你解决,我的第二个回答......