Linuxシステム:pstackコマンドは、プロセスの呼び出しスタックをトレースします。

pstackコマンドは、プロセスのスタック(ユーザーモード)トレースを表示するために使用されますpstackコマンドは、対応するプロセスの所有者またはルートアカウントが実行する必要があります。pstackを使用して、プロセスがハングする場所を特定できます。このコマンドにはパラメータが1つだけあり、それはpidです。ここでのpidは、プロセスpidまたはスレッドtidにすることができます。パラメーターがtidの場合、pstackは現在のスレッドの呼び出しスタックを出力します。パラメーターがpidの場合、現在のプロセスのすべてのスレッドのすべての呼び出しスタックを出力します。 。pstackについての簡単な紹介は、manマニュアルにあります。簡単なマルチスレッドの例は次のとおりです。

#include<stdio.h>
#include<stdlib.h>
#include <pthread.h>
 
void* task_entry(void* arg);  
 
int main(){  
    pthread_t pid1,pid2;  
 
    pthread_create(&pid1,NULL,task_entry,(void *)1);  
    pthread_create(&pid2,NULL,task_entry,(void *)2);  
 
    pthread_join(pid1,NULL);  
    pthread_join(pid2,NULL);  
 
    return 0;  
}
  
void* task_entry(void* arg){  
	while(1){
		sleep(1);
	}
}

pstackの使用法は次のとおりです。パラメーターは、プロセスのスレッドtidとpidです。

[root@localhost some_func]# gcc multithreading.c -o multithreading -lpthread
[root@localhost some_func]# ./multithreading &
[1] 23539
[root@localhost some_func]# pstree -p 23539
multithreading(23539)─┬─{multithreading}(23540)
                      └─{multithreading}(23541)
//线程
[root@localhost some_func]# pstack 23541
Thread 1 (process 23541):
#0  0x00000031ce8aca7d in nanosleep () from /lib64/libc.so.6
#1  0x00000031ce8ac8f0 in sleep () from /lib64/libc.so.6
#2  0x0000000000400646 in task_entry ()
#3  0x00000031cf407aa1 in start_thread () from /lib64/libpthread.so.0
#4  0x00000031ce8e893d in clone () from /lib64/libc.so.6

//进程
[root@localhost some_func]# pstack 23539
Thread 3 (Thread 0x7f115e248700 (LWP 23540)):
#0  0x00000031ce8aca7d in nanosleep () from /lib64/libc.so.6
#1  0x00000031ce8ac8f0 in sleep () from /lib64/libc.so.6
#2  0x0000000000400646 in task_entry ()
#3  0x00000031cf407aa1 in start_thread () from /lib64/libpthread.so.0
#4  0x00000031ce8e893d in clone () from /lib64/libc.so.6
Thread 2 (Thread 0x7f115d847700 (LWP 23541)):
#0  0x00000031ce8aca7d in nanosleep () from /lib64/libc.so.6
#1  0x00000031ce8ac8f0 in sleep () from /lib64/libc.so.6
#2  0x0000000000400646 in task_entry ()
#3  0x00000031cf407aa1 in start_thread () from /lib64/libpthread.so.0
#4  0x00000031ce8e893d in clone () from /lib64/libc.so.6
Thread 1 (Thread 0x7f115e24a700 (LWP 23539)):
#0  0x00000031cf4082fd in pthread_join () from /lib64/libpthread.so.0
#1  0x0000000000400613 in main ()

注:pstackが追跡するのは、ユーザーモードの呼び出しスタックです

おすすめ

転載: blog.csdn.net/wangquan1992/article/details/108415936