【问题标题】:How to understand "/proc/[pid]/stack"?如何理解“/proc/[pid]/stack”?
【发布时间】:2015-10-30 05:40:47
【问题描述】:

根据proc手册:

/proc/[pid]/stack (Linux 2.6.29 起)

这个文件提供了函数调用的符号跟踪 此进程的内核堆栈。此文件仅在以下情况下提供 内核是使用 CONFIG_STACKTRACE 配置构建的 选项。

所以我写了一个程序来测试:

#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
#include <pthread.h>

void *thread_func(void *p_arg)
{
        pid_t pid = fork();
        if (pid > 0) {
            wait(NULL);
            return 0;
        } else if (pid == 0) {
            sleep(1000);
            return 0;
        }
        return NULL;
}
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 0;
}

运行后,使用pstack查看线程的进度:

linux-uibj:~ # pstack 24976
Thread 3 (Thread 0x7fd6e4ed5700 (LWP 24977)):
#0  0x00007fd6e528d3f4 in wait () from /lib64/libpthread.so.0
#1  0x0000000000400744 in thread_func ()
#2  0x00007fd6e52860a4 in start_thread () from /lib64/libpthread.so.0
#3  0x00007fd6e4fbb7fd in clone () from /lib64/libc.so.6
Thread 2 (Thread 0x7fd6e46d4700 (LWP 24978)):
#0  0x00007fd6e528d3f4 in wait () from /lib64/libpthread.so.0
#1  0x0000000000400744 in thread_func ()
#2  0x00007fd6e52860a4 in start_thread () from /lib64/libpthread.so.0
#3  0x00007fd6e4fbb7fd in clone () from /lib64/libc.so.6
Thread 1 (Thread 0x7fd6e569f700 (LWP 24976)):
#0  0x00007fd6e4f8d6cd in nanosleep () from /lib64/libc.so.6
#1  0x00007fd6e4f8d564 in sleep () from /lib64/libc.so.6
#2  0x00000000004007b1 in main ()

同时查看/proc/24976/stack

linux-uibj:~ # cat /proc/24976/stack
[<ffffffff804ba1a7>] system_call_fastpath+0x16/0x1b
[<00007fd6e4f8d6cd>] 0x7fd6e4f8d6cd
[<ffffffffffffffff>] 0xffffffffffffffff

24976 进程有3 线程,它们都阻塞系统调用(nanosleepwait),所以所有3 线程现在都在kernel 空间中工作,并变成内核线程现在,对吧?如果这是真的,/proc/[pid]/stack 文件中应该有3 堆栈。但似乎/proc/[pid]/stack 文件中只有1 堆栈。

我应该如何理解/proc/[pid]/stack

【问题讨论】:

    标签: linux multithreading linux-kernel pthreads


    【解决方案1】:

    我应该如何理解/proc/[pid]/stack

    取自man 页面proc

    还有其他有用的伪路径:

    [堆栈] 初始进程(也称为主线程)的堆栈。

    在此下方,您可以找到:

    [stack:[tid]](Linux 3.4 起)

    线程的堆栈(其中 [tid] 是线程 ID)。 对应/proc/[pid]/task/[tid]/path。

    这似乎是您正在寻找的。​​p>

    【讨论】:

    • 经过你的提示,我得到了答案:在Linux上,线程实际上是一个进程,所以/proc/[tid]/stack会得到线程的内核堆栈信息,或者使用/proc/[pid]/task/[tid]/stack
    【解决方案2】:

    南萧是对的。
    线程内核模式堆栈位于 /proc/[PID]/task/[TID]/stack 下。

    您正在检查 /proc/[PID]/stack,这是主线程堆栈,所以您只有 1 个。其他在任务文件夹下。

    【讨论】:

      【解决方案3】:

      那是睡眠锁。您还可以查看 perf -g 以了解自旋锁,包括高系统时间。

      【讨论】:

      • 这个答案是指“那是为了睡眠锁”?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      相关资源
      最近更新 更多