跟蹤程序在Linux下的執行的函數調用
本篇文章主要是向大家講述了跟蹤程序是如何在Linux下執行的函數調用,作者從基本概念、具體實例方面進行講解,相信對于Linux的初學者來說會有很大的幫助!
對于一個程序,通常我們可以使用gdb之類的調用工具設定斷點進行調用。然而Linux系統提供了眾多的跟蹤工具,可以讓我們在沒有源代碼的情況下跟蹤程序都執行了哪些系統調用、動態庫調用、棧情況以及接收信號等。可以讓我們不停止程序來觀察程序的執行流程。
strace 顯示執行程序的系統調用及接收信號情況;
strace [strace 選項] 可執行程序 可執行程序參數。
選項說明:
-o filename 將輸出寫到文件filename中;
-f 跟蹤子進程的執行,適合多線程程序;
-ff 如果使用了-o指定輸出文件,則將每個子進程都寫入到filename.pid中;
-s strsize,指定最大字串大小,默認為32;
-r 打印相對時間戳;
-t 打印實際時間 -tt 打印毫秒級 -ttt 打印微秒級時間;
-x 將所有非ASCII字符串顯示為十六進制字串;
-xx 將所有字符串顯示為十六進制;
-P pid 附著于進程進行跟蹤,并在ctrl+c后離開保持被跟蹤程序執行。
-e key=[!]value[,value]或-evalue,只顯示value的系統調用;
key包括trace、abbrev、verbose、raw、signal、read、write,value為系統調用的符號。
例如-e trace=open,默認使用trace=all。
為了方便使用value定義了一些不同類型的系統調用:file代表所有文件相關調用,process涉及相關進程的調用,network涉及相關網絡系統調用,signal代表所有信號相關的系統調用,此外還有ipc,desc。其他的key如abbrev、verbose、raw表示使用什么樣的輸出方式。signal可以跟蹤特定信號集的接收情況。默認為signal=ALL,可以使用SIGIO這種方式。而read/write則可以指定跟蹤寫特定文件描述符的動作,并將讀寫數據以十六進制的方式打印出來。例如-e read=3,5。
ltrace 顯示執行程序的庫調用及接收信號情況,其與strace的使用參數類似,支持-e -f -P -s -t -tt -tt -o -ff等參數,此外它還支持下面的一些參數:
-C --demangle 轉換低級編譯器的符號令用戶易看,例如C++等的mangle操作;
-l --library libname,lib... 只顯示對libname中的庫調用;
-S 顯示系統調用,-L 不顯示庫調用;
-n num 當嵌套調用時,進行縮進顯示;
對于不同的庫中的調用,列于/etc/ltrace.conf文件中。
pstack 打印命中時程序的調用棧及相應參數;
pstack pid即可。
【編輯推薦】