2015-10-30 25 views
10

Według proc instrukcji:Jak zrozumieć "/ proc/[pid]/stack"?

/proc/[pid]/stos (od wersji Linuksa 2.6.29)

Ten plik stanowi symboliczny ślad wywołań funkcji w stosu jądra tego procesu jest. Ten plik jest dostarczany tylko wtedy, gdy jądro zostało zbudowane przy użyciu opcji CONFIG_STACKTRACE konfiguracji jądra.

więc napisać program do testu:

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

Po uruchomieniu, należy pstack sprawdzić wątki postępu:

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() 

Jednocześnie należy sprawdzić /proc/24976/stack:

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

The 24976 proces ma 3 wątki, a oni wszyscy blok na wywołanie systemowe (nanosleep i wait), więc wszystkie wątki 3 teraz pracować w kernel przestrzeni i przekształcić wątków jądra teraz, prawda? Jeśli to prawda, w pliku 3 powinny znajdować się stosy. Wygląda jednak na to, że w pliku znajduje się tylko jeden plik.

Jak powinienem zrozumieć /proc/[pid]/stack?

Odpowiedz

5

Jak należy rozumieć /proc/[pid]/stack?

Wykonano ze stron man do proc:

Istnieją dodatkowe osób pseudo-ścieżki:

[stos] początkowa procesu (znany również jako główny wątku) stosu.

Tuż poniżej tego, można znaleźć:

[stosu: [tid]] (od Linuksa 3.4)

stos wątku użytkownika (gdzie [tid] to identyfikator wątku) . Odpowiada to/proc/[pid]/task/[tid]/path.

Co wydaje się być tym, czego szukasz.

+3

Po podpowiedziach otrzymuję odpowiedź: w systemie Linux wątek jest w rzeczywistości procesem, więc '/ proc/[tid]/stack' pobiera informacje o stosie jądra wątku lub używa'/proc/[pid]/task/[tid]/stack'. –