如何理解“/ proc / [pid] / stack”?

时间:2015-10-30 05:40:48

标签: linux multithreading linux-kernel pthreads

根据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空间,现在变成内核线程吧?如果是这样,3文件中应该有/proc/[pid]/stack个堆栈。但似乎1文件中只有/proc/[pid]/stack堆栈。

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

3 个答案:

答案 0 :(得分:5)

  

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

取自proc的{​​{3}}页:

  

还有其他有用的伪路径:

     

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

在此之下,您可以找到:

  

[stack:[tid]](自Linux 3.4开始)

     

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

这似乎就是你要找的。

答案 1 :(得分:1)

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

您正在检查/ proc / [PID] / stack,这是主线程堆栈,因此只有1.。其他位于任务文件夹下。

答案 2 :(得分:-1)

用于睡眠锁。您可能还会查看perf -g来查看自旋锁,包括较长的系统时间。