我正在尝试在 gdb 中的 linux 中为创建线程的程序设置断点。我想在线程创建时设置一个断点,但不幸pthread_create
的是一个版本符号,我无法获得它的全名。
如果我输入:
catch thread_start
我明白了
Catch of thread_start not yet implemented
在这种情况下,如何在 gdb 中捕获线程创建的最佳方法是什么?
我正在尝试在 gdb 中的 linux 中为创建线程的程序设置断点。我想在线程创建时设置一个断点,但不幸pthread_create
的是一个版本符号,我无法获得它的全名。
如果我输入:
catch thread_start
我明白了
Catch of thread_start not yet implemented
在这种情况下,如何在 gdb 中捕获线程创建的最佳方法是什么?
好的,所以如果我不太了解你,或者我的第一个答案没有帮助,请执行以下操作:
(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。
好的,我将发布两个答案,因为我不确定我是否理解您的问题。
首先: pthread_create 在共享库中,gdb 知道如何处理它。如果你只是说“break pthread_create”,它应该“正常工作”。
您不需要知道这一点,但它应该工作的方式是 gdb 会找到一个符号“pthread_create@plt”,它是一个通向动态加载器的存根,最终将被跳转到适当的共享库函数。我们将在那里设置一个断点,gdb 将自动处理动态加载器,直到最终到达(并停止)正确的共享库函数。
现在,如果这不能为您解决问题,请继续我的第二个答案......