Hỗ trợ cho Bản đồ hoàn hảo

Trên các nền tảng được hỗ trợ (tính đến thời điểm viết bài này, chỉ có Linux), thời gian chạy có thể tận dụng perf map files để hiển thị các hàm Python cho một công cụ định hình bên ngoài (chẳng hạn như perf). Một quy trình đang chạy có thể tạo một tệp trong thư mục /tmp, chứa các mục có thể ánh xạ một phần mã thực thi thành tên. Giao diện này được mô tả trong documentation of the Linux Perf tool.

Trong Python, các API trợ giúp này có thể được sử dụng bởi các thư viện và tính năng dựa vào việc tạo mã máy một cách nhanh chóng.

Lưu ý rằng việc giữ attached thread state là không bắt buộc đối với các API này.

int PyUnstable_PerfMapState_Init(void)
Đây là API không ổn định. Nó có thể thay đổi mà không có cảnh báo trong các bản phát hành nhỏ.

Mở tệp /tmp/perf-$pid.map, trừ khi nó đã được mở và tạo một khóa để đảm bảo ghi an toàn theo luồng vào tệp (miễn là việc ghi được thực hiện thông qua PyUnstable_WritePerfMapEntry()). Thông thường, không cần phải gọi điều này một cách rõ ràng; chỉ cần sử dụng PyUnstable_WritePerfMapEntry() và nó sẽ khởi tạo trạng thái trong cuộc gọi đầu tiên.

Trả về 0 nếu thành công, -1 khi không tạo/mở tệp bản đồ hoàn hảo hoặc -2 khi không tạo được khóa. Kiểm tra errno để biết thêm thông tin về nguyên nhân lỗi.

int PyUnstable_WritePerfMapEntry(const void *code_addr, unsigned int code_size, const char *entry_name)
Đây là API không ổn định. Nó có thể thay đổi mà không có cảnh báo trong các bản phát hành nhỏ.

Viết một mục duy nhất vào tệp /tmp/perf-$pid.map. Chức năng này là chủ đề an toàn. Đây là giao diện của một mục ví dụ:

tên kích thước # address
7f3529fcf759 b py::bar:/run/t.py

Sẽ gọi PyUnstable_PerfMapState_Init() trước khi viết mục, nếu tệp bản đồ hoàn hảo chưa được mở. Trả về 0 nếu thành công hoặc trả về mã lỗi tương tự như PyUnstable_PerfMapState_Init() nếu thất bại.

void PyUnstable_PerfMapState_Fini(void)
Đây là API không ổn định. Nó có thể thay đổi mà không có cảnh báo trong các bản phát hành nhỏ.

Đóng tệp bản đồ hoàn hảo được mở bởi PyUnstable_PerfMapState_Init(). Điều này được gọi bởi chính thời gian chạy trong khi tắt trình thông dịch. Nói chung, không có lý do gì để gọi điều này một cách rõ ràng, ngoại trừ để xử lý các tình huống cụ thể như phân nhánh.