C gdb如何检测pthread?

C gdb如何检测pthread?,c,gdb,pthreads,C,Gdb,Pthreads,最近我一直在学习pthread。然后我突然想到gdb如何知道我创建了一个新线程。然后我写下下面的测试代码并启动了gdb。我进入pthread_create()函数,但不是让它正常返回,而是使用return0返回pthread_create()函数。但gdb仍然显示我只有一个线程。起初,我认为gdb从pthread_create()函数的返回值中获取线程信息,然后我认为gdb也可能使用子进程信息来获取线程信息,所以我编辑了测试代码。但结果不是我想象的那样 那么gdb如何获取线程信息呢?它需要什么样

最近我一直在学习pthread。然后我突然想到gdb如何知道我创建了一个新线程。然后我写下下面的测试代码并启动了gdb。我进入pthread_create()函数,但不是让它正常返回,而是使用
return0
返回pthread_create()函数。但gdb仍然显示我只有一个线程。起初,我认为gdb从pthread_create()函数的返回值中获取线程信息,然后我认为gdb也可能使用子进程信息来获取线程信息,所以我编辑了测试代码。但结果不是我想象的那样

那么gdb如何获取线程信息呢?它需要什么样的信息才能知道主线程有多少个线程以及我在哪个线程上

代码

#包括
#包括
#包括
#包括
#包括“pthread.h”
void*foo(void*bar){
而(1){
printf(“来自线程的你好:%d\n”,pthread_self());
睡眠(2);
}
}
int main(){
printf(“伪pthread_create之前”);
pid_t pid;
如果((pid=fork())=-1){
perror(“分叉错误”);
出口(errno);
}
如果(pid==0){
而(1){
睡眠(3);
}
}
如果(pid>0){
pthread\u t线程;
pthread_创建(&thread,NULL,foo,NULL);
而(1){
printf(“来自线程的你好:%d\n”,pthread_self());
睡眠(2);
}
返回0;
}
}

调试器在linux上使用的主要机制有两种,它们都不是很好。这里有太多的细节,我只能告诉你,希望如此

一种是ptrace,它允许调试器在程序执行操作(如执行系统命令,如
pthread\u create
),或发生特定事件(如新线程启动)时跟踪并控制受监视的程序:

另一个是/proc/file系统,它显示了有关流程的大量信息:

特别是
ls-l/proc/self/tasks
向您展示了
ls
线程的功能(仅1个)

gdb如何检测pthread

GDB在
\u dl\u debug\u state
上设置内部断点,这允许它跟踪加载的共享库(这是调试共享库所必需的)

当它观察到加载了
libpthread.so
时,它将
libthread_db.so.1
加载到自己的进程空间(加载到GDB本身,而不是加载到正在调试的程序中),并要求库在创建新线程和销毁新线程时通知GDB


libthread\u db
非常了解
libpthread
的内部结构,并安装适当的钩子来实现此类通知。

GDB使用
libthread\u db
,这两种机制都不是您列出的机制。没错,但在用户端库libthread\u db内部使用了许多机制,包括,至少在linux上,ptrace和/proc/以及它自己的秘密助手线程。但是,是的,谢谢你提醒我libthread_db。出于所有实际目的,请在thread函数的第一行设置一个断点,当然,不加载libthread_db.so.1的静态程序除外,例如默认情况下在R中编写的许多程序。
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include "pthread.h"

void *foo(void *bar) {
        while(1) {
                printf("hello from thread: %d\n", pthread_self());
                sleep(2);
        }
}

int main() {
        printf("Before fake pthread_create");
        pid_t pid;
        if ((pid = fork()) == -1) {
                perror("fork error");
                exit(errno);
        }
        if (pid == 0) {
                while(1) {

                        sleep(3);
                }
        }

        if (pid > 0) {

                pthread_t thread;
                pthread_create(&thread, NULL, foo, NULL);
                while(1) {
                        printf("hello from thread: %d\n", pthread_self());
                        sleep(2);
                }
                return 0;
        }
}