Perf Maps 支持

在支持的平台上(截至撰写本文时,仅限 Linux),运行时可以利用perf map 文件使 Python 函数对外部分析工具(例如 perf)可见。一个正在运行的进程可能会在 /tmp 目录下创建一个文件,其中包含可以将可执行代码段映射到名称的条目。此接口在Linux Perf 工具文档中描述。

在 Python 中,库和依赖于动态生成机器码的功能可以使用这些辅助 API。

请注意,这些 API 不需要持有全局解释器锁 (GIL)。

int PyUnstable_PerfMapState_Init(void)
这是 不稳定 API。它可能会在次要版本中更改,恕不另行通知。

打开 /tmp/perf-$pid.map 文件(如果尚未打开),并创建一个锁以确保对该文件进行线程安全的写入(前提是写入是通过 PyUnstable_WritePerfMapEntry() 完成的)。通常,不需要显式调用此函数;只需使用 PyUnstable_WritePerfMapEntry(),它将在第一次调用时初始化状态。

成功返回 0,创建/打开 perf map 文件失败返回 -1,创建锁失败返回 -2。检查 errno 以获取有关失败原因的更多信息。

int PyUnstable_WritePerfMapEntry(const void *code_addr, unsigned int code_size, const char *entry_name)
这是 不稳定 API。它可能会在次要版本中更改,恕不另行通知。

将一个条目写入 /tmp/perf-$pid.map 文件。此函数是线程安全的。以下是一个示例条目的外观

# address      size  name
7f3529fcf759 b     py::bar:/run/t.py

如果 perf map 文件尚未打开,则在写入条目之前调用 PyUnstable_PerfMapState_Init()。成功返回 0,失败返回与 PyUnstable_PerfMapState_Init() 相同的错误代码。

void PyUnstable_PerfMapState_Fini(void)
这是 不稳定 API。它可能会在次要版本中更改,恕不另行通知。

关闭由 PyUnstable_PerfMapState_Init() 打开的 perf map 文件。这由运行时本身在解释器关闭期间调用。通常,除了处理诸如 fork 之类的特定场景外,没有理由显式调用此函数。