使用strace和ltrace跟踪程序调用
生活随笔
收集整理的這篇文章主要介紹了
使用strace和ltrace跟踪程序调用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
ltrace能夠跟蹤進程的庫函數(shù)調(diào)用,它會顯現(xiàn)出哪個庫函數(shù)被調(diào)用,而strace則是跟蹤程序的每個系統(tǒng)調(diào)用.
1.系統(tǒng)調(diào)用的輸出對比
程序代碼:
用#ltrace跟蹤程序:
用#strace跟蹤程序:
我們看到程序調(diào)用write()系統(tǒng)調(diào)用做了輸出,同時strace還把程序運行時所做的系統(tǒng)調(diào)用都打印出來了.
其實#ltrace -S也可以把系統(tǒng)調(diào)用都打印出來:
注:我們看到它實際是用SYS_write系統(tǒng)調(diào)用來做打印輸出,其實write()函數(shù)是SYS_write的封裝,SYS_write是真正的系統(tǒng)調(diào)用.
2.ltrace/strace的耗時
# ltrace -c dd if=/dev/urandom of=/dev/null count=1000
使用-c選項,ltrace輸出由進程創(chuàng)建的庫調(diào)用,輸出結(jié)果以調(diào)用過程的時間為準(zhǔn)進行排序,因為是從urandom設(shè)備上讀,這是一種產(chǎn)生隨機數(shù)的設(shè)備,完成后,寫入null設(shè)備. 所以讀過程花費了較多的時間. 使用ltrace去捕獲運行時函數(shù),就好像在進程上系上了一個調(diào)試工具,它占據(jù)了ltrace大量的時間,這里ltrace一共消耗了3.28秒.
我們再來看一下strace所花費的時間:
# strace -c dd if=/dev/urandom of=/dev/null count=1000
strace一共消耗了0.008秒,strace把性能提升了很多倍,這主要是strace在跟蹤系統(tǒng)調(diào)用的時候不需要動態(tài)庫,而ltrace是根據(jù)動態(tài)庫來分析程序運行的. 所以ltrace也只能跟蹤動態(tài)庫,不能跟蹤靜態(tài)庫. 事實上我們用ltrace和strace都可以發(fā)現(xiàn)程序在哪個系統(tǒng)調(diào)用時發(fā)生了性能瓶徑. ltrace用-T,而strace也用-T.
3.ltrace與strace的相同點
ltrace與strace都可以指定PID,即對運行中的程序進行跟蹤. ltrace -p PID與strace -p PID
ltrace與strace都可以跟蹤程序fork或clone子進程. ltrace是用-f參數(shù),而strace是用-f(fork/clone)和-F(vfork).
擴充閱讀:
1.系統(tǒng)調(diào)用的輸出對比
程序代碼:
#include <stdio.h>
main(){char str[]= "Abcde";printf("\n string = %s length = %d \n",str,str_length(str));
}int str_length (const char *s){int length = 0;while (*s++){length++;}return (length);
}用#ltrace跟蹤程序:
用#strace跟蹤程序:
我們看到程序調(diào)用write()系統(tǒng)調(diào)用做了輸出,同時strace還把程序運行時所做的系統(tǒng)調(diào)用都打印出來了.
其實#ltrace -S也可以把系統(tǒng)調(diào)用都打印出來:
注:我們看到它實際是用SYS_write系統(tǒng)調(diào)用來做打印輸出,其實write()函數(shù)是SYS_write的封裝,SYS_write是真正的系統(tǒng)調(diào)用.
2.ltrace/strace的耗時
# ltrace -c dd if=/dev/urandom of=/dev/null count=1000
使用-c選項,ltrace輸出由進程創(chuàng)建的庫調(diào)用,輸出結(jié)果以調(diào)用過程的時間為準(zhǔn)進行排序,因為是從urandom設(shè)備上讀,這是一種產(chǎn)生隨機數(shù)的設(shè)備,完成后,寫入null設(shè)備. 所以讀過程花費了較多的時間. 使用ltrace去捕獲運行時函數(shù),就好像在進程上系上了一個調(diào)試工具,它占據(jù)了ltrace大量的時間,這里ltrace一共消耗了3.28秒.
我們再來看一下strace所花費的時間:
# strace -c dd if=/dev/urandom of=/dev/null count=1000
strace一共消耗了0.008秒,strace把性能提升了很多倍,這主要是strace在跟蹤系統(tǒng)調(diào)用的時候不需要動態(tài)庫,而ltrace是根據(jù)動態(tài)庫來分析程序運行的. 所以ltrace也只能跟蹤動態(tài)庫,不能跟蹤靜態(tài)庫. 事實上我們用ltrace和strace都可以發(fā)現(xiàn)程序在哪個系統(tǒng)調(diào)用時發(fā)生了性能瓶徑. ltrace用-T,而strace也用-T.
3.ltrace與strace的相同點
ltrace與strace都可以指定PID,即對運行中的程序進行跟蹤. ltrace -p PID與strace -p PID
ltrace與strace都可以跟蹤程序fork或clone子進程. ltrace是用-f參數(shù),而strace是用-f(fork/clone)和-F(vfork).
擴充閱讀:
技巧: 使用truss、strace或ltrace診斷軟件的"疑難雜癥"
總結(jié)
以上是生活随笔為你收集整理的使用strace和ltrace跟踪程序调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自己写的内存池Slabs
- 下一篇: 为什么TCP的TIME_WAIT状态要保