2017-03-08 26 views
2

我正在寫一個探查器,我想知道線程創建以來的總時間以及該線程在特定計算中使用的總CPU時間。如何在LLVM傳遞中檢測線程入口/重生點?

通過時間我的意思是:因爲像thread my_thread(function)一個帶有螺紋花費被封鎖無論什麼原因,時間的時間,所以總的時間過去了。

getrusage給了我調用線程的CPU時間,這很好,但是,我想知道線程創建以來的總時間。我根本找不到任何C++庫。

我可以通過儀表程序創建/產生線程並插入一個簡單的時間戳方法,如chrono函數,然後計算其他時間戳時產生一個時間戳,它們的區別是我想要的時間。但是,即使經過一些搜索,我也無法弄清楚如何使用LLVM傳遞檢測線程入口/產生點。

關於如何檢測線程入口/重生點在LLVM通過任何建議?

此致敬禮!

回答

1

我想,你需要搜索CallInst S的來電pthread_create,然後分析他們的觀點,並找出回調函數,它們在傳遞。

爲了確保您捕獲所有的線程創建調用,你」 d需要研究如何在您的平臺上創建線程。在最低級別,創建線程需要系統調用(在大多數情況下)。例如,FreeBSD確實具有pthread_create函數,但它純粹是userland,並將線程創建委託給thr_new系統調用。一些程序(Rust語言運行時,IIRC)可能會直接調用該系統調用,繞過pthread_create,但這些非常罕見。所以,如果你真的想確保你抓住每一個線程創建,你需要搜索CallInst s到這些低級別的。

+0

感謝您的回答!是的,我也這麼想過。但是有沒有其他的方法來產生一個線程?當我檢查pthread_create的調用時,這些方法會被捕獲嗎?我不這麼認爲。 –

+0

@DanishAlsayed我已經更新了我的答案。 – arrowd