2015-10-30 4 views
10

"/ proc/[pid]/stack"の理解方法は? <code>proc</code>マニュアルによると

の/ proc/[PID] /スタック(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を使用します。/proc/24976/stackを確認し、同時に

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

を:

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

24976のプロセスは、システムコール(nanosleepwait)上のすべてのブロックを3のスレッドを持っており、彼らので、すべての3スレッドが今kernelスペースでの作業、およびカーネルスレッド今、右に回しますか?これが当てはまる場合、スタックが/proc/[pid]/stackファイルに存在するはずです。しかし、/proc/[pid]/stackファイルには1スタックしかないようです。

/proc/[pid]/stackをどうすればわかりますか?

答えて

5

私は/proc/[pid]/stackをどのように理解する必要がありますか? procためmanページから撮影

追加人擬似パスがあります

【スタック】 初期プロセスのスタック(メインスレッドのように知られています)。ただ、この下の

、あなたは見つけることができます:

[スタック:[TID]](Linuxの3.4以降)([TID]はスレッドIDである)

スレッドのスタック。 これは/ proc/[pid]/task/[tid] /パスに対応します。

あなたが探しているようです。

+3

Linuxのスレッドは実際にはプロセスなので、/ proc/[tid]/stackはスレッドのカーネルスタック情報を取得するか、 '/ proc/[pid] /タスク/ [tid] /スタック '。 –

関連する問題