1. 程式人生 > >LINUX ltrace命令-用來跟蹤程序呼叫庫函式的情況學習

LINUX ltrace命令-用來跟蹤程序呼叫庫函式的情況學習

參考連結:

http://www.bluestep.cc/linux-ltrace%E5%91%BD%E4%BB%A4-%E7%94%A8%E6%9D%A5%E8%B7%9F%E8%B8%AA%E8%BF%9B%E7%A8%8B%E8%B0%83%E7%94%A8%E5%BA%93%E5%87%BD%E6%95%B0%E7%9A%84%E6%83%85%E5%86%B5/

ltrace命令是用來跟蹤程序呼叫庫函式的情況。

語法:

ltrace [option ...] [command [arg ...]]

選項

-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.

例項

   最基本應用,不帶任何引數:

[[email protected] tmp]$ ltrace ./a.out
__libc_start_main(0x80484aa, 1, 0xbfc07744, 0x8048550, 0x8048540 <unfinished ...>
printf("no1:%d \t no2:%d \t diff:%d\n", 10, 6, 4no1:10 no2:6 diff:4 ) = 24
printf("no1:%d \t no2:%d \t diff:%d\n", 9, 7, 2no1:9 no2:7 diff:2 ) = 23
printf("no1:%d \t no2:%d \t diff:%d\n", 8, 8, 0no1:8 no2:8 diff:0 ) = 23
--- SIGFPE (Floating point exception) ---
+++ killed by SIGFPE +++

   輸出呼叫時間開銷:

[[email protected] tmp]$ ltrace -T ./a.out
__libc_start_main(0x80484aa, 1, 0xbf81d394, 0x8048550, 0x8048540 <unfinished ...>
printf("no1:%d \t no2:%d \t diff:%d\n", 10, 6, 4no1:10 no2:6 diff:4 ) = 24 <0.000972>
printf("no1:%d \t no2:%d \t diff:%d\n", 9, 7, 2no1:9 no2:7 diff:2 ) = 23 <0.000155>
printf("no1:%d \t no2:%d \t diff:%d\n", 8, 8, 0no1:8 no2:8 diff:0 ) = 23 <0.000153>
--- SIGFPE (Floating point exception) ---
+++ killed by SIGFPE +++

   顯示系統呼叫:

[[email protected] tmp]$ ltrace -S ./a.out
SYS_brk(NULL) = 0x9e20000
SYS_access(0xa4710f, 4, 0xa4afc0, 0, 0xa4b644) = 0
SYS_open("/etc/ld.so.preload", 0, 02) = 3
SYS_fstat64(3, 0xbfbd7a94, 0xa4afc0, -1, 3) = 0
SYS_mmap2(0, 17, 3, 2, 3) = 0xb7f2a000
SYS_close(3) = 0
SYS_open("/lib/libcwait.so", 0, 00) = 3
SYS_read(3, "\177ELF\001\001\001", 512) = 512
SYS_fstat64(3, 0xbfbd76fc, 0xa4afc0, 4, 0xa4b658) = 0
SYS_mmap2(0, 4096, 3, 34, -1) = 0xb7f29000
SYS_mmap2(0, 5544, 5, 2050, 3) = 0x423000
SYS_mmap2(0x424000, 4096, 3, 2066, 3) = 0x424000
.............省去若干行