2017-03-08 53 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