linux系统:pstack命令追踪进程的调用栈。

pstack命令用来显示进程的栈(用户态)跟踪。 pstack 命令必须由相应进程的属主或root账号运行。可以使用pstack来确定进程挂起的位置。此命令只有一个参数,那就是 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
今日推荐