問題描述:
很明顯,這時程式調試者需要知道不重新整理線程的線程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