跟蹤程式在Linux下的執行的函數調用

來源:互聯網
上載者:User

本篇文章主要是向大家講述了跟蹤程式是如何在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即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.