Поддержка Perf Maps¶Support for 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при успехе,-1при неудаче создания/открытия файла perf map или-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
Вызовет
PyUnstable_PerfMapState_Init()перед записью записи, если файл perf map ещё не открыт. Возвращает0при успехе или те же коды ошибок, что иPyUnstable_PerfMapState_Init(), при неудаче.
-
void PyUnstable_PerfMapState_Fini(void)¶
- Это нестабильное API. Оно может меняться без предупреждения в минорных версиях.
Закрывает файл perf map, открытый с помощью
PyUnstable_PerfMapState_Init(). Эта функция вызывается самой средой выполнения при завершении интерпретатора. В целом, нет причин вызывать её явно, за исключением обработки особых сценариев, таких как форк.