【问题标题】:gdb how to get thread name displayedgdb如何显示线程名称
【发布时间】:2012-02-15 04:26:51
【问题描述】:

我的应用程序中创建了许多线程。当我执行命令“信息线程”时,一些线程名称在 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 处设置断点,并在下一行创建一个线程。
  • 这不是线程名,而是该线程当前正在执行的函数名。

标签: c linux gdb pthreads


【解决方案1】:

如果您升级到 gdb 7.3 或更高版本,“信息线程”将显示线程名称;至少在本机(非远程)Linux 上。

【讨论】:

    【解决方案2】:

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

    尝试选择其中一个线程并查看回溯 - 这可能会让您很好地了解它是哪个线程。否则,您可以尝试 prctlPR_SET_NAME(如果可用)。

    【讨论】:

    • 一个更简单的方法是 pthread_setname_np(pthread_t , const char)
    【解决方案3】:

    您可以通过非标准 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");
    

    【讨论】:

    【解决方案4】:
    • (gdb) 信息线程 - 将显示所有线程

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

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

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多