summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorŁukasz Langa <lukasz@langa.pl>2016-09-10 00:37:37 (GMT)
committerŁukasz Langa <lukasz@langa.pl>2016-09-10 00:37:37 (GMT)
commita785c87d6eacbed81543a8afe3cb098fabb9610a (patch)
treeee127bbbef66a386f4c7f7a21d1e69a54eed5a52 /Include
parent39b42ae8dbf81ee89dabf1c418c9081243b4ab97 (diff)
downloadcpython-a785c87d6eacbed81543a8afe3cb098fabb9610a.zip
cpython-a785c87d6eacbed81543a8afe3cb098fabb9610a.tar.gz
cpython-a785c87d6eacbed81543a8afe3cb098fabb9610a.tar.bz2
DTrace support: function calls, GC activity, line execution
Tested on macOS 10.11 dtrace, Ubuntu 16.04 SystemTap, and libbcc. Largely based by an initial patch by Jesús Cea Avión, with some influence from Dave Malcolm's SystemTap patch and Nikhil Benesch's unification patch. Things deliberately left out for simplicity: - ustack helpers, I have no way of testing them at this point since they are Solaris-specific - PyFrameObject * in function__entry/function__return, this is SystemTap-specific - SPARC support - dynamic tracing - sys module dtrace facility introspection All of those might be added later.
Diffstat (limited to 'Include')
-rw-r--r--Include/pydtrace.d19
-rw-r--r--Include/pydtrace.h47
2 files changed, 66 insertions, 0 deletions
diff --git a/Include/pydtrace.d b/Include/pydtrace.d
new file mode 100644
index 0000000..8836055
--- /dev/null
+++ b/Include/pydtrace.d
@@ -0,0 +1,19 @@
+/* Python DTrace provider */
+
+provider python {
+ probe function__entry(const char *, const char *, int);
+ probe function__return(const char *, const char *, int);
+ probe instance__new__start(const char *, const char *);
+ probe instance__new__done(const char *, const char *);
+ probe instance__delete__start(const char *, const char *);
+ probe instance__delete__done(const char *, const char *);
+ probe line(const char *, const char *, int);
+ probe gc__start(int);
+ probe gc__done(long);
+};
+
+#pragma D attributes Evolving/Evolving/Common provider python provider
+#pragma D attributes Evolving/Evolving/Common provider python module
+#pragma D attributes Evolving/Evolving/Common provider python function
+#pragma D attributes Evolving/Evolving/Common provider python name
+#pragma D attributes Evolving/Evolving/Common provider python args
diff --git a/Include/pydtrace.h b/Include/pydtrace.h
new file mode 100644
index 0000000..4c06d0e
--- /dev/null
+++ b/Include/pydtrace.h
@@ -0,0 +1,47 @@
+/* Static DTrace probes interface */
+
+#ifndef Py_DTRACE_H
+#define Py_DTRACE_H
+
+#ifdef WITH_DTRACE
+
+#include "pydtrace_probes.h"
+
+/* pydtrace_probes.h, on systems with DTrace, is auto-generated to include
+ `PyDTrace_{PROBE}` and `PyDTrace_{PROBE}_ENABLED()` macros for every probe
+ defined in pydtrace_provider.d.
+
+ Calling these functions must be guarded by a `PyDTrace_{PROBE}_ENABLED()`
+ check to minimize performance impact when probing is off. For example:
+
+ if (PyDTrace_FUNCTION_ENTRY_ENABLED())
+ PyDTrace_FUNCTION_ENTRY(f);
+*/
+
+#else
+
+/* Without DTrace, compile to nothing. */
+
+#define PyDTrace_LINE(arg0, arg1, arg2, arg3) do ; while (0)
+#define PyDTrace_FUNCTION_ENTRY(arg0, arg1, arg2) do ; while (0)
+#define PyDTrace_FUNCTION_RETURN(arg0, arg1, arg2) do ; while (0)
+#define PyDTrace_GC_START(arg0) do ; while (0)
+#define PyDTrace_GC_DONE(arg0) do ; while (0)
+#define PyDTrace_INSTANCE_NEW_START(arg0) do ; while (0)
+#define PyDTrace_INSTANCE_NEW_DONE(arg0) do ; while (0)
+#define PyDTrace_INSTANCE_DELETE_START(arg0) do ; while (0)
+#define PyDTrace_INSTANCE_DELETE_DONE(arg0) do ; while (0)
+
+#define PyDTrace_LINE_ENABLED() (0)
+#define PyDTrace_FUNCTION_ENTRY_ENABLED() (0)
+#define PyDTrace_FUNCTION_RETURN_ENABLED() (0)
+#define PyDTrace_GC_START_ENABLED() (0)
+#define PyDTrace_GC_DONE_ENABLED() (0)
+#define PyDTrace_INSTANCE_NEW_START_ENABLED() (0)
+#define PyDTrace_INSTANCE_NEW_DONE_ENABLED() (0)
+#define PyDTrace_INSTANCE_DELETE_START_ENABLED() (0)
+#define PyDTrace_INSTANCE_DELETE_DONE_ENABLED() (0)
+
+#endif /* !WITH_DTRACE */
+
+#endif /* !Py_DTRACE_H */