如何在gdb中显示线程名称

11

我的应用程序中创建了许多线程。当我执行'info threads'命令时,其中一些线程名称在gdb中可见,而其他线程则不显示其名称,如何获取所有线程的名称而不是像0xb7fe1424这样的十六进制值?

4 Thread 0xb68ffb70 (LWP 18377)  0xb7fe1424 in __kernel_vsyscall ()
* 3 Thread 0xb7291b70 (LWP 18375)  JKMainT (arg=0x0) at mylib.cpp:482
2 Thread 0xb7a92b70 (LWP 18374)  0xb7fe1424 in __kernel_vsyscall ()
1 Thread 0xb7a94730 (LWP 18371)  0xb7fe1424 in __kernel_vsyscall ()

要添加更多代码,我在mylib.cpp的482行处设置了断点,然后它会创建一个线程。 - Whoami
1
那不是线程名称,而是该线程当前正在执行的函数名称。 - Dark Falcon
4个回答

10
如果您升级到gdb 7.3或更高版本,“info thread”将显示线程名称;至少在本地(而非远程)Linux上是如此。

9

您可以通过非标准的POSIX API调用设置线程名称。GDB(以及其他调试器)将显示这些名称。

在Linux上

// watch out, 16 char limit on the name
pthread_setname_np(pthread_self(), "My thread name");

在Mac上

pthread_setname_np("My thread name");

相关:https://dev59.com/MHE95IYBdhLWcg3wSsGD - Ciro Santilli OurBigBook.com

8

默认情况下,线程没有名称-那里的JKMainT字符串是当前函数的名称。

尝试选择其中一个线程并查看回溯-这可能会让您了解哪个线程是哪个。否则,如果有的话,您可以尝试prctlPR_SET_NAME


5
更简单的做法是使用 pthread_setname_np(pthread_t , const char) 函数。 - manylegged

0
  • (gdb) info threads - 将显示所有线程

  • (gdb) thread - 会切换到您选择的线程并显示线程名称

  • (gdb) thread - 将显示当前线程名称


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接