【问题标题】:How to detect thread entry/spawn point in LLVM pass?如何检测 LLVM 通道中的线程入口/生成点?
【发布时间】:2017-07-28 18:29:22
【问题描述】:

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

时间我的意思是:时间包括线程因任何原因被阻塞所花费的时间,因此自thread my_thread(function)之类的事情以来经过的总时间。

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

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

关于如何在 LLVM 通道中检测线程入口/生成点有什么建议吗?

最好的问候!

【问题讨论】:

    标签: c++ multithreading time profiling llvm


    【解决方案1】:

    我猜,你需要搜索调用pthread_createCallInsts,然后分析它们的参数并找出它们传入的回调函数。

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

    例如,FreeBSD 确实有一个 pthread_create 函数,但它是纯粹的用户空间,并将线程创建委托给 thr_new 系统调用。一些程序(Rust 语言运行时,IIRC)可能会直接调用该系统调用,绕过pthread_create,但这些非常罕见。因此,如果您真的想确保捕获每个线程创建,则需要搜索 CallInsts 到这些低级线程。

    【讨论】:

    • 感谢您的回答!是的,我也想过。但是还有其他方法可以生成线程吗?当我检查 pthread_create 的调用时,这些方法会被捕获吗?我不这么认为。
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多