1、pstack/gstack:print a stack trace of a running process
1)用法:gstack pid。
2)簡介:gstack命令attach到指定pid的進程,並打印其執行堆棧跟蹤(execution stack trace)。若是多線程進程,還可以分別打印出各線程的堆棧跟蹤。如以下片斷:
Thread 28 (Thread 0x7f771e50c700 (LWP 24360)): #0 0x00000038cfa0b63c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000004b3c08 in boost::asio::detail::task_io_service::run(boost::system::error_code&) () #2 0x0000000000534da3 in io_service_pool::runService(std::shared_ptr<boost::asio::io_service>) () ... ...
gstack打印的只是某一瞬間進程/線程的堆棧跟蹤,但可以通過頻繁采樣(如每秒執行一次)獲得足夠的統計信息,並保存到文件中,再作分析。
3)原理:
[root@localhost ~]# which gstack /usr/bin/gstack [root@localhost ~]# file /usr/bin/gstack /usr/bin/gstack: POSIX shell script, ASCII text executable
gstack實際上是shell腳本,它應用了gdb的thread apply all bt子命令。thread apply表示將一個命令(bt)應用到指定的一些線程(all)。
4)應用:
(1)使用pstack確定進程掛起的位置。
(2)比如,同一程序的兩個不同版本在運行時CPU的使用情況有明顯的不同,則可分別收集它們的統計信息,再作比較(如從#0入手),從中找出兩者函數調用情況的不同之處等。
不斷學習中。。。
