GDB 查看线程信息

例子

#include <stdio.h>
#include <pthread.h>
void *thread_func(void *p_arg)
{
    while (1)
    {
        printf("%s\n", (char*)p_arg);
        sleep(10);
    }
}
int main(void)
{
    pthread_t t1, t2;

    pthread_create(&t1, NULL, thread_func, "Thread 1");
    pthread_create(&t2, NULL, thread_func, "Thread 2");

    sleep(1000);
    return;
}

技巧

用gdb调试多线程程序,可以用 i threads 命令(i 是 info 命令缩写)查看所有线程的信息,以上面程序为例(运行平台为Linux,CPU为X86_64):

(gdb) i threads
  Id   Target Id         Frame
  3    Thread 0x7ffff6e2b700 (LWP 31773) 0x00007ffff7915911 in clone () from /lib64/libc.so.6
  2    Thread 0x7ffff782c700 (LWP 31744) 0x00007ffff78d9bcd in nanosleep () from /lib64/libc.so.6
* 1    Thread 0x7ffff7fe9700 (LWP 31738) main () at a.c:18

第一项(Id):是gdb标示每个线程的唯一ID:1,2等等。第二项(Target Id):是具体系统平台用来标示每个线程的ID,不同平台信息可能会不同。像当前Linux平台显示的就是:Thread 0x7ffff6e2b700 (LWP 31773)。第三项(Frame):显示的是线程执行到哪个函数。前面带“*”表示的是“current thread”,可以理解为gdb调试多线程程序时,选择的一个“默认线程”。

再以Solaris平台(CPU为X86_64)为例,可以看到显示信息会略有不同:

(gdb) i threads
[New Thread 2 (LWP 2)]
[New Thread 3 (LWP 3)]
  Id   Target Id         Frame
  6    Thread 3 (LWP 3)  0xfeec870d in _thr_setup () from /usr/lib/libc.so.1
  5    Thread 2 (LWP 2)  0xfefc9661 in elf_find_sym () from /usr/lib/ld.so.1
  4    LWP    3          0xfeec870d in _thr_setup () from /usr/lib/libc.so.1
  3    LWP    2          0xfefc9661 in elf_find_sym () from /usr/lib/ld.so.1
* 2    Thread 1 (LWP 1)  main () at a.c:18
  1    LWP    1          main () at a.c:18

也可以用 i threads [Id...] 指定打印某些线程的信息,例如:

(gdb) i threads 1 2
  Id   Target Id         Frame
  2    Thread 0x7ffff782c700 (LWP 12248) 0x00007ffff78d9bcd in nanosleep () from /lib64/libc.so.6
* 1    Thread 0x7ffff7fe9700 (LWP 12244) main () at a.c:18

参见gdb手册.


   转载规则


《GDB 查看线程信息》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
GDB 调试多线程:从创建示例到逐线程调试 GDB 调试多线程:从创建示例到逐线程调试
1. 线程的查看首先创建两个线程: #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #include &
2021-04-25
下一篇 
GDB 变量查看:print、display 与 watch GDB 变量查看:print、display 与 watch
前言在启动调试以及设置断点之后,就到了我们非常关键的一步——查看变量。GDB 调试最大的目的之一就是走查代码,查看运行结果是否符合预期。既然如此,我们就不得不了解一些查看各种类型变量的方法,以帮助我们进一步定位问题。 准备工作本文辅助说明程
2021-04-01
  目录