【问题标题】:How does gdb detect pthread?gdb如何检测pthread?
【发布时间】:2019-09-16 16:08:03
【问题描述】:

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

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

代码

#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;
        }
}

【问题讨论】:

  • 出于所有实际目的,在线程函数的第一行设置一个断点

标签: c gdb pthreads


【解决方案1】:

gdb 如何检测 pthread?

GDB 在_dl_debug_state 上设置内部断点,这允许它跟踪加载了哪些共享库(这是调试共享库所必需的)。

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

libthread_db 非常了解libpthread 的内部结构,并安装了适当的挂钩来实现此类通知。

【讨论】:

  • 当然不加载 libthread_db.so.1 的静态程序除外,例如许多默认用 R 编写的程序。
【解决方案2】:

调试器在 linux 上使用的主要机制有两种,它们都不是很漂亮。这里有太多细节,我只能指点你那里并希望。

一种是 ptrace,它允许调试器跟随程序执行操作,例如执行pthread_create 之类的系统命令,或发生特定事件,例如新线程启动,并控制被监视的程序:http://man7.org/linux/man-pages/man2/ptrace.2.html

另一个是 /proc/ 文件系统,它揭示了有关进程的大量信息:http://man7.org/linux/man-pages/man5/proc.5.html

特别是ls -l /proc/self/tasks 向您显示ls 有哪些线程(只有1 个)。

【讨论】:

  • GDB 使用libthread_db,这都不是您列出的机制。
  • 没错,但在内部,用户端库 libthread_db 使用了许多机制,包括至少在 Linux 上的 ptrace 和 /proc/ 以及它自己的秘密帮助线程。但是,是的,感谢您提醒我有关 libthread_db 的信息。
猜你喜欢
  • 1970-01-01
  • 2012-08-19
  • 2016-06-21
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
相关资源
最近更新 更多