2015-10-30 13 views
10

:"/ proc/[pid]/stack" nasıl anlaşılır? <code>proc</code> el kitabına göre

/Proc/[PID]/yığın (Linux 2.6.29 beri)

Bu dosya fonksiyonunun sembolik bir iz sağlar bu işlemin çekirdek yığın çağırır. Bu dosya yalnızca çekirdeği CONFIG_STACKTRACE yapılandırması seçeneği ile oluşturulduysa sağlanır.

yüzden teste için bir program yazmak:

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

çalıştırdıktan sonra, ilerleme konuları kontrol etmek pstack kullanın: Aynı zamanda

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 kontrol edin:

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

24976 süreç 3 konuları vardır ve bunlar sistem çağrısı (nanosleep ve wait), tüm blok nedenle tüm 3 ipler artık kernel uzayda çalışmak ve çekirdek evreleri şimdi sağ dönüşür? Bu doğruysa, /proc/[pid]/stack dosyasında 3 yığınları olmalıdır. Ancak, /proc/[pid]/stack dosyasında yalnızca 1 yığını var gibi görünüyor.

nasıl /proc/[pid]/stack anlamalıyız?

cevap

5

/proc/[pid]/stack nasıl anlaşmalıyım?

proc için man sayfalarından alınmıştır:

ilave yardımcı sözde yolları vardır:

[yığın] yığını (aynı zamanda ana parçacığının olarak da bilinir) ilk süreç. Bunun hemen altında

, şunları bulabilirsiniz:

[yığını: [tid]] (Linux 3.4 beri) ([tid] bir iş parçacığı kimliğidir)

Bir parçacığının yığını . /proc/[pid]/task/[tid]/yoluna karşılık gelir. görünüyor

aradığınız şey olması. senin ipuçları sonra

+3

, cevabı alıyorum: Linux üzerinde, iplik aslında bir süreçtir, bu yüzden '/ proc/[TID] parçacığının Çekirdek yığını bilgi almak veya kullanacağı/stack''/proc/[pid]/görev/[tID]/stack'. –

İlgili konular