天天看點

linux跟蹤線程的方法:LWP和strace指令

問題描述:

很明顯,這時程式調試者需要知道不重新整理線程的線程ID,然後通過某種手段檢視該線程為何出現了異常。通過linux的ps -eLF|grep pid指令可以檢視程序的線程ID(LWP号),但是問題在于如果我們沒有在建立線程時記錄其線程ID,我們仍然無法得知哪個LWP号是我們想要追蹤的。

我們來看一下LWP号是什麼,以及如何在建立線程時記錄每個線程的LWP号。

pthread_create是基于clone實作的, 建立出來的其實是程序, 但這些程序與父程序共享很多東西, 

共享的東西都不用複制給子程序, 進而節省很多開銷, 是以,這些子程序也叫輕量級程序(light-weight process)簡稱LWP. 每個LWP都會與一個核心線程綁定, 這樣它就可以作為獨立的排程實體參與cpu競争. 

LWP被pthread封裝後, 以線程面目示人, 它有自己的id, 這裡要區分 phtread_create

使用者, 後者其實就是程序的id, 它沒有暴露出來, 必須通過系統調用來得到.

擷取LWP的方法是通過syscall系統調用(具體說明參加man手冊),下面是一個例子程式:

在擷取LWP号以後,接下來就是通過strace指令對線程進行追蹤了。

strace的參數有很多,常見的參數介紹如下:

-o filename  将strace的輸出寫入檔案filename 

-p pid      跟蹤指定的程序pid. 

-t   在輸出中的每一行前加上時間資訊. 

-tt  在輸出中的每一行前加上時間資訊,微秒級.  

-T   顯示每一調用所耗的時間. 

-f   跟蹤由fork調用所産生的子程序. 

-ff  如果提供-o filename,則所有程序的跟蹤結果輸出到相應的filename.pid中,pid是各程序的程序     号. 

總結:在設計程式的時候,一定要考慮将來的維護問題。對于多線程程式,其調試會更加困難,通過在建立線程中記錄LWP号和對應的線程功能,可以為以後的調試提供很大幫助。

參考文章:

1、關于Linux的程序和線程

http://kenby.iteye.com/blog/1014039

2、linux strace指令:

http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html

繼續閱讀