如何在LLVM传递中检测线程入口/生成点?

时间:2017-03-08 09:07:25

标签: c++ multithreading time profiling llvm

我正在编写一个分析器,我想知道自创建线程以来的总时间以及该线程用于某个计算的总CPU时间。

通过 总计 时间我的意思是:时间包括线程因任何原因而被阻止的时间,因此总时间超过thread my_thread(function)之类的时间。

getrusage给了我调用线程的CPU时间,这是好的,但是,我想知道自创建线程以来经过的总时间。我根本找不到任何C ++库。

我可以通过检测程序并插入一个简单的时间戳方法(例如chrono函数)然后在我进行计算时插入另一个时间戳来创建/生成线程的时间戳,它们的区别在于我想要的时间。但是,即使经过一些搜索,我也无法弄清楚如何使用LLVM传递来检测线程入口/生成点。

有关如何检测LLVM传递中的线程入口/生成点的任何建议?

祝你好运!

1 个答案:

答案 0 :(得分:1)

我想,您需要搜索调用CallInst的{​​{1}},然后分析他们的参数并找出传入的回调函数。

为了确保捕获所有线程创建调用,您需要研究如何在平台上创建线程。在最低级别,线程创建需要系统调用(在大多数情况下)。

例如,FreeBSD确实有pthread_create函数,但它纯粹是userland,并将线程创建委托给pthread_create系统调用。某些程序(Rust语言运行时,IIRC)可能会绕过thr_new直接调用该系统调用,但这些很少见。所以,如果你真的想确保捕获每个线程创建,你需要搜索pthread_create s到这些低级别的。{/ p>