2021-05-12 14:32:11
Linux上進程追蹤與偵錯(strace和gdb)
引言:
我們某些服務出現故障的時候,我們都是根據螢幕的輸出以及列印的紀錄檔來查詢出出現了什麼樣的錯誤,但是有時候我們的很多守護行程啟動正常卻存取不到,比如我們使用Nginx服務,登陸web的時候,卻遲遲不發生頁面跳轉或者存取頁面遲遲沒反應,這個時候我們就需要對Nginx這個服務做一次進程追蹤,我們使用strace/gdb這樣的命令對進程做一次追蹤,
strace:
1,strace命令說明
strace是能夠顯示使用者空間發出的任何系統呼叫,在命令的執行過程中,strace會記錄和解析命令進程的所有系統呼叫以及這個進程所收到的所有信號值
2,strace的使用
1)strace後面直接跟我們的命令
可以看到後面跟了許多系統呼叫的函數,我們根據這些可以清楚的知道,我們這個命令執行時發生了那些系統呼叫
2)使用-p選項,這個後面跟我們的pid號,可以檢視當前進程處於什麼狀態
我們使用-p選項後面跟著nginx的進程號
我們可以看到,當我們的nginx沒有存取量的時候,進程處於epoll_wait狀態
當使用ab來對nginx做一次壓力測試的時候,就會發現nginx進程瘋狂的做系統呼叫
存取資料的時候,需要處理各種資料,進程會有大量的系統呼叫產生
3)使用-c選項,我們可以顯示進程使用系統呼叫的摘要資訊,及使用了多少次系統呼叫
我們可以看到使用的read,write,open這些系統呼叫,以及總共產生了多少次系統呼叫
4)使用-o選項,我們可以將分析結構儲存在某個檔案中,以供後續分析使用
5) 使用-t(秒)-tt(微秒)-ttt(微秒,時間為UNIX時間戳,即從1970年1月1日起的時間)
gdb:
<1>gdb命令說明
gdb是Linux下及UNIX下的程式偵錯工具,我們可以啟動程式,讓程式按照我們的需求來自由的執行
<2>gdb使用attach,後面跟著我們的pid資訊,檢視我們的進程狀態
如果想知道程式現在執行到了哪裡,同樣可以使用“backtrace”命令。當然也可以使用“step”命令對程式進行單步偵錯。在完成偵錯之後,不要忘記用detach命令斷開連線,讓被偵錯的進程可以繼續正常執行。
gdb是個很複雜的工具,一般Linux下的C開發程式設計師會用到的比較多,這裡就不做深入探討了。
GDB偵錯工具入門 http://www.linuxidc.com/Linux/2016-09/135168.htm
在Ubuntu上用GDB偵錯printf原始碼 http://www.linuxidc.com/Linux/2013-03/80346.htm
Linux下用GDB偵錯可載入模組 http://www.linuxidc.com/Linux/2013-01/77969.htm
強大的C/C++ 程式偵錯工具GDB http://www.linuxidc.com/Linux/2016-09/135171.htm
使用GDB命令列偵錯程式偵錯C/C++程式 http://www.linuxidc.com/Linux/2014-11/109845.htm
GDB偵錯命令總結 http://www.linuxidc.com/Linux/2016-08/133988.htm
GDB偵錯工具入門 http://www.linuxidc.com/Linux/2016-09/135168.htm
相關文章