@@ -27,6 +27,7 @@ open_probe.add_ptr_arg(name='mode',
open_probe.register()
tep = tc.local_tep()
+tc.short_kprobe_print(tep, [open_probe])
def callback(event, record):
print(tep.info(event, record))
@@ -533,6 +533,44 @@ PyObject *PyTep_process(PyTep *self, PyObject *args,
return PyUnicode_FromString(seq.buffer);
}
+static int kprobe_info_short(struct trace_seq *s,
+ struct tep_record *record,
+ struct tep_event *event,
+ void *context)
+{
+ /* Do not print the address of the probe (first field). */
+ unsigned long long select_mask = ~0x1;
+
+ tep_record_print_selected_fields(s, record, event, select_mask);
+
+ return 0;
+}
+
+PyObject *PyTep_short_kprobe_print(PyTep *self, PyObject *args,
+ PyObject *kwargs)
+{
+ static char *kwlist[] = {"system", "event", "id", NULL};
+ const char *system, *event;
+ int ret, id = -1;
+
+ system = event = NO_ARG;
+
+ if(!PyArg_ParseTupleAndKeywords(args,
+ kwargs,
+ "ss|i",
+ kwlist,
+ &system,
+ &event,
+ &id)) {
+ return false;
+ }
+
+ ret = tep_register_event_handler(self->ptrObj, id, system, event,
+ kprobe_info_short, NULL);
+
+ return PyLong_FromLong(ret);
+}
+
static bool check_file(struct tracefs_instance *instance, const char *file)
{
if (!tracefs_file_exists(instance, file)) {
@@ -63,6 +63,9 @@ PyObject *PyTep_info(PyTep *self, PyObject *args,
PyObject *PyTep_process(PyTep *self, PyObject *args,
PyObject *kwargs);
+PyObject *PyTep_short_kprobe_print(PyTep *self, PyObject *args,
+ PyObject *kwargs);
+
PyObject *PyTfsInstance_dir(PyTfsInstance *self);
PyObject *PyKprobe_event(PyKprobe *self);
@@ -83,6 +83,11 @@ static PyMethodDef PyTep_methods[] = {
METH_VARARGS | METH_KEYWORDS,
"Generic print of a trace event info."
},
+ {"short_kprobe_print",
+ (PyCFunction) PyTep_short_kprobe_print,
+ METH_VARARGS | METH_KEYWORDS,
+ "Do not print the address of the probe."
+ },
{NULL}
};
@@ -29,6 +29,14 @@ def find_event_id(system, event):
return tep.get_event(system=system, name=event).id()
+def short_kprobe_print(tep, events):
+ """ Register short (no probe address) print for these kprobe events.
+ """
+ for e in events:
+ if len(e.fields):
+ tep.short_kprobe_print(id=e.evt_id, system=e.system, event=e.name)
+
+
class event:
def __init__(self, system, name, static=True):
""" Constructor.
The default event handler for parsing ("info print") includes the address of the probe. This address can be valuable for kernel developers, but is meaningless if you only care for userspace. Here we add a method that allows the user to register an alternative event handler that doesn't show the address. Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> --- examples/kprobe_open.py | 1 + src/ftracepy-utils.c | 38 ++++++++++++++++++++++++++++++++++++++ src/ftracepy-utils.h | 3 +++ src/ftracepy.c | 5 +++++ tracecruncher/ft_utils.py | 8 ++++++++ 5 files changed, 55 insertions(+)