API پایش C¶
در نسخه 3.13 افزوده شد.
یک ماژول توسعهای ممکن است نیاز به تعامل با سامانه پایش رویدادها داشته باشد. اشتراک در رویدادها و ثبت کالبکها را میتوان از طریق API پایتون ارائهشده در sys.monitoring انجام داد.
تولید رویدادهای اجرا¶
توابع زیر این امکان را فراهم میکنند که یک ماژول توسعهای بتواند هنگام شبیهسازی اجرای کد پایتون، رویدادهای پایش را ایجاد کند. هر یک از این توابع یک ساختار PyMonitoringState را میپذیرد که اطلاعات مختصری دربارهی وضعیت فعالسازی رویدادها و همچنین آرگومانهای رویداد را در بر دارد؛ این آرگومانها شامل یک PyObject* که نمایانگر شیء کد است، آفست دستورالعمل و گاهی آرگومانهای اضافی خاص رویداد هستند (برای جزئیات دربارهی امضاهای کالبکهای مختلف رویداد به sys.monitoring مراجعه کنید). آرگومان codelike باید نمونهای از types.CodeType یا از نوعی باشد که آن را شبیهسازی میکند.
ماشین مجازی هنگام فعالسازی رویداد، ردگیری را غیرفعال میکند، بنابراین نیازی نیست که کد کاربر این کار را انجام دهد.
توابع نظارت نباید در حالی که استثنایی تنظیم شده است فراخوانی شوند، بهجز مواردی که در ادامه بهعنوان توابعی که با استثنای جاری کار میکنند فهرست شدهاند.
-
type PyMonitoringState¶
بازنمایی وضعیت یک نوع رویداد. آن توسط کاربر تخصیص داده میشود، در حالی که محتویات آن توسط توابع API پایش که در ادامه توضیح داده شدهاند، نگهداری میشود.
تمام توابع زیر در صورت موفقیت 0 و در صورت خطا -1 (همراه با تنظیم استثنا) را برمیگردانند.
برای توضیحات رویدادها به sys.monitoring مراجعه کنید.
-
int PyMonitoring_FirePyStartEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)¶
رویداد
PY_STARTرا فعال میکند.
-
int PyMonitoring_FirePyResumeEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)¶
رویداد
PY_RESUMEرا فعال میکند.
-
int PyMonitoring_FirePyReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *retval)¶
رویداد
PY_RETURNفعال میشود.
-
int PyMonitoring_FirePyYieldEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *retval)¶
رویداد
PY_YIELDرا فعال میکند.
-
int PyMonitoring_FireCallEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *callable, PyObject *arg0)¶
رویداد
CALLرا فراخوانی میکند.
-
int PyMonitoring_FireLineEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, int lineno)¶
رویداد
LINEفعال میشود.
-
int PyMonitoring_FireJumpEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset)¶
رویداد
JUMPفعال میشود.
-
int PyMonitoring_FireBranchLeftEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset)¶
رویداد
BRANCH_LEFTرا فعال کنید.
-
int PyMonitoring_FireBranchRightEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset)¶
رویداد
BRANCH_RIGHTرا فعال کنید.
-
int PyMonitoring_FireCReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *retval)¶
رویداد
C_RETURNفعال میشود.
-
int PyMonitoring_FirePyThrowEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)¶
رویداد
PY_THROWرا با استثنای فعلی (همانطور کهPyErr_GetRaisedException()برمیگرداند) فعال میکند.
-
int PyMonitoring_FireRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)¶
رویداد
RAISEبه همراه استثنای فعلی (همانطور که توسطPyErr_GetRaisedException()برگردانده میشود) شلیک میشود.
-
int PyMonitoring_FireCRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)¶
رویداد
C_RAISEرا همراه با استثنای فعلی (همانطور که توسطPyErr_GetRaisedException()برگردانده میشود) فعال میکند.
-
int PyMonitoring_FireReraiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)¶
رویداد
RERAISEرا با استثنای فعلی (که توسطPyErr_GetRaisedException()برگردانده میشود) صادر میکند.
-
int PyMonitoring_FireExceptionHandledEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)¶
رویداد
EXCEPTION_HANDLEDرا همراه با استثنای فعلی (که توسطPyErr_GetRaisedException()برگردانده میشود) فعال میکند.
-
int PyMonitoring_FirePyUnwindEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)¶
رویداد
PY_UNWINDرا با استثنای فعلی (همانطور که توسطPyErr_GetRaisedException()برگردانده میشود) فعال کنید.
-
int PyMonitoring_FireStopIterationEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value)¶
رویداد
STOP_ITERATIONرا اجرا میکند. اگرvalueنمونهای ازStopIterationباشد، از آن استفاده میشود. در غیر این صورت، نمونهی جدیدی ازStopIterationباvalueبهعنوان آرگومان آن ایجاد میشود.
مدیریت وضعیت پایش¶
وضعیتهای نظارت را میتوان با کمک محدودههای نظارت مدیریت کرد. یک محدوده معمولاً متناظر با یک تابع پایتون است.
-
int PyMonitoring_EnterScope(PyMonitoringState *state_array, uint64_t *version, const uint8_t *event_types, Py_ssize_t length)¶
ورود به یک محدودهی پایششده.
event_typesآرایهای از شناسههای رویداد برای رویدادهایی است که ممکن است از این محدوده رخ دهند. برای مثال، شناسهی رویدادPY_STARTمقدارPY_MONITORING_EVENT_PY_STARTاست که از نظر عددی با لگاریتم پایه ۲sys.monitoring.events.PY_STARTبرابر است.state_arrayآرایهای است که برای هر رویداد درevent_typesیک ورودی وضعیت پایش دارد؛ این آرایه توسط کاربر تخصیص داده میشود، اما توسطPyMonitoring_EnterScope()با اطلاعاتی دربارهی وضعیت فعالسازی رویداد پر میشود. اندازهیevent_types(و در نتیجهstate_arrayنیز) درlengthداده میشود.آرگومان
versionاشارهگری به مقداری است که باید توسط کاربر همراه باstate_arrayتخصیص داده شود و به 0 مقداردهی اولیه گردد، و سپس تنها توسط خودِPyMonitoring_EnterScope()تنظیم شود. این به تابع امکان میدهد تشخیص دهد که آیا وضعیتهای رویداد از فراخوانی قبلی تغییر کردهاند یا خیر، و در صورت عدم تغییر، بهسرعت بازگردد.محدودههایی که در اینجا به آنها اشاره میشود، محدودههای واژگانی هستند: یک تابع، کلاس یا متد. هرگاه به محدوده واژگانی وارد میشود، باید
PyMonitoring_EnterScope()فراخوانی شود. در موقعیتهایی مانند هنگام شبیهسازی یک تابع بازگشتی پایتون، میتوان دوباره وارد محدودهها شد و از همان state_array و version استفاده مجدد کرد. هنگامی که اجرای یک شیء شبهکد (code-like) متوقف میشود، مانند هنگام شبیهسازی یک تولیدگر، باید از محدوده خارج و دوباره به آن وارد شد.ماکروهای event_types عبارتاند از:
ماکرو
رویداد
-
PY_MONITORING_EVENT_BRANCH_LEFT¶
-
PY_MONITORING_EVENT_BRANCH_RIGHT¶
-
PY_MONITORING_EVENT_CALL¶
-
PY_MONITORING_EVENT_C_RAISE¶
-
PY_MONITORING_EVENT_C_RETURN¶
-
PY_MONITORING_EVENT_EXCEPTION_HANDLED¶
-
PY_MONITORING_EVENT_INSTRUCTION¶
-
PY_MONITORING_EVENT_JUMP¶
-
PY_MONITORING_EVENT_LINE¶
-
PY_MONITORING_EVENT_PY_RESUME¶
-
PY_MONITORING_EVENT_PY_RETURN¶
-
PY_MONITORING_EVENT_PY_START¶
-
PY_MONITORING_EVENT_PY_THROW¶
-
PY_MONITORING_EVENT_PY_UNWIND¶
-
PY_MONITORING_EVENT_PY_YIELD¶
-
PY_MONITORING_EVENT_RAISE¶
-
PY_MONITORING_EVENT_RERAISE¶
-
PY_MONITORING_EVENT_STOP_ITERATION¶
-
PY_MONITORING_EVENT_BRANCH_LEFT¶
-
int PyMonitoring_ExitScope(void)¶
از آخرین محدودهای که با
PyMonitoring_EnterScope()وارد شده بود، خارج شوید.
-
int PY_MONITORING_IS_INSTRUMENTED_EVENT(uint8_t ev)¶
اگر رویداد متناظر با شناسهی رویداد ev یک رویداد محلی باشد، مقدار true برمیگرداند.
اضافه شده در نسخهی 3.13.
منسوخسازی نرم <Soft deprecated> از نسخهی 3.14.