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