strace & ltrace & phpstrace

strace

strace是Linux環境下的一款程序調試工具,用來監察一個應用程序所使用的系統調用及它所接收的系統信息。追蹤程序運行時的整個生命週期,輸出每個系統調用的名字,參數,返回值和執行消耗的時間等。php

經常使用參數:

-p 跟蹤指定的進程
-f 跟蹤由fork子進程系統調用
-F 嘗試跟蹤vfork子進程系統調吸入,與-f同時出現時, vfork不被跟蹤
-o filename 默認strace將結果輸出到stdout。經過-o能夠將輸出寫入到filename文件中
-ff 常與-o選項一塊兒使用,不一樣進程(子進程)產生的系統調用輸出到filename.PID文件
-r 打印每個系統調用的相對時間
-t 在輸出中的每一行前加上時間信息。 -tt 時間肯定到微秒級。還能夠使用-ttt打印相對時間
-v 輸出全部系統調用。默認狀況下,一些頻繁調用的系統調用不會輸出
-s 指定每一行輸出字符串的長度,默認是32。文件名一直所有輸出
-c 統計每種系統調用所執行的時間,調用次數,出錯次數。
-e expr 輸出過濾器,經過表達式,能夠過濾出掉你不想要輸出mysql

追蹤多個進程方法

當有多個子進程的狀況下,好比php-fpm、nginx等,用strace追蹤顯得很不方便。能夠使用下面的方法來追蹤全部的子進程。linux

# vim /root/.bashrc //添加如下內容
function straceall {
    strace $(pidof "${1}" | sed 's/\([0-9]*\)/-p \1/g')
}
# source /root/.bashrc
# traceall php-fpm //監控phpfpm
OR
# strace -tt -T $(pidof 'php-fpm: pool www' | sed 's/\([0-9]*\)/\-p \1/g')

追蹤web服務

# strace -f -F -s 1024 -o nginx-strace /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# strace -f -F -o php-fpm-strace /usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm.conf

追蹤mysql

# strace -f -F -ff -o mysqld-strace -s 1024 -p mysql_pid
# find ./ -name "mysqld-strace*" -type f -print |xargs grep -n "SELECT.*FROM"

查看程序作了什麼

#!/bin/bash
# This script is from http://poormansprofiler.org/
nsamples=1
sleeptime=0
pid=$(pidof $1)
 
for x in $(seq 1 $nsamples)
  do
    gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid
    sleep $sleeptime
  done | \
awk '
  BEGIN { s = ""; } 
  /^Thread/ { print s; s = ""; } 
  /^\#/ { if (s != "" ) { s = s "," $4} else { s = $4 } } 
  END { print s }' | \
sort | uniq -c | sort -r -n -k 1,1

ltrace

-a 對齊具體某個列的返回值
-c 計算時間和調用,並在程序退出時打印摘要
-C 解碼低級別名稱(內核級)爲用戶級名稱
-d 打印調試信息
-e 改變跟蹤的事件
-f 跟蹤子進
-h 打印幫助信息
-i 打印指令指針,當庫調用時。
-l 只打印某個庫中的調用。
-L 不打印庫調用。
-n, --indent=NR 對每一個調用級別嵌套以NR個空格進行縮進輸出。
-o, --output=file 把輸出定向到文件。
-p PID 附着在值爲PID的進程號上進行ltrace。
-r 打印相對時間戳。
-s STRLEN 設置打印的字符串最大長度。
-S 顯示系統調用。
-t, -tt, -ttt 打印絕對時間戳。
-T 輸出每一個調用過程的時間開銷。
-u USERNAME 使用某個用戶id或組ID來運行命令。
-V, --version 打印版本信息,而後退出。
-x NAME treat the global NAME like a library subroutine.nginx

phpstrace

phpstrace追蹤php進程git

Usage: ./php-strace [ options ]
-h|--help               show this help
-l|--lines <integer>    output the last N lines of a stacktrace. Default: 100
--process-name <string> name of running php processes. Default: autodetect
--live                  search while running for new upcoming pid's

使用truss/strace/ltrace跟蹤進程github

相關文章
相關標籤/搜索