#927010 python3-babeltrace: Event instances all refer to a constantly-overwritten data - unexpected behaviours and segfaults

Package:
python3-babeltrace
Source:
babeltrace
Description:
Babeltrace Python 3 bindings
Submitter:
Date:
2019-10-31 15:15:08 UTC
Severity:
wishlist
#927010#5
Date:
2019-04-13 14:23:23 UTC
From:
To:
While investigating why I was getting a segfault while processing a CTF trace (in which I
do a first pass extracting some info, before a second pass plotting the data...
while keeping a ref to various events to avoid making copies of everything in
the first pass), I finally understand that even though we get individual python handles
for all events, they get clobbered by further event parsing.


This script:
----->8------
#!/usr/bin/env python3
import babeltrace
import sys

trace_collection = babeltrace.TraceCollection()
trace_collection.add_traces_recursive(sys.argv[1], 'ctf')

mylist = []
for event in trace_collection.events:
    print(event, event.timestamp)
    mylist.append(event)

print("====")

for event in mylist:
    print(event, event.timestamp)
----->8------

shows:

<babeltrace.babeltrace.Event object at 0x7f0a0e727550> 1555157078087460409
<babeltrace.babeltrace.Event object at 0x7f0a0e7278d0> 1555157078447798861
<babeltrace.babeltrace.Event object at 0x7f0a0e727908> 1555157079242934356
...
<babeltrace.babeltrace.Event object at 0x7f0a0dfee320> 1555157103166619955
<babeltrace.babeltrace.Event object at 0x7f0a0dfee6a0> 1555157103183287540
<babeltrace.babeltrace.Event object at 0x7f0a0dfeea20> 1555157103200021333
====
<babeltrace.babeltrace.Event object at 0x7f0a0e727550> 1555157103200021333
<babeltrace.babeltrace.Event object at 0x7f0a0e7278d0> 1555157103200021333
<babeltrace.babeltrace.Event object at 0x7f0a0e727908> 1555157103200021333
...
<babeltrace.babeltrace.Event object at 0x7f0a0dfee320> 1555157103200021333
<babeltrace.babeltrace.Event object at 0x7f0a0dfee6a0> 1555157103200021333
<babeltrace.babeltrace.Event object at 0x7f0a0dfeea20> 1555157103200021333



Something feels Just Wrong here, and I somehow feel it could be linked to my script seeing, while
attempting to access fields of Event objects after keeping a ref to them:

=====
$ gdb --args python3 ../scripts/graph-lttstats.py .../ust/
(gdb) r
...

Program received signal SIGSEGV, Segmentation fault.
bt_ctf_get_top_level_scope (ctf_event=ctf_event@entry=0xa64188, scope=BT_EVENT_FIELDS) at events.c:89
89      events.c: No such file or directory.
(gdb) directory /home/yann/soft/babeltrace/babeltrace-1.5.6/formats/ctf
Source directories searched: /home/yann/soft/babeltrace/babeltrace-1.5.6/formats/ctf:$cdir:$cwd
(gdb) l
84              case BT_EVENT_CONTEXT:
85                      if (event->event_context)
86                              tmp = &event->event_context->p;
87                      break;
88              case BT_EVENT_FIELDS:
89                      if (event->event_fields)
90                              tmp = &event->event_fields->p;
91                      break;
92              }
93              return tmp;
(gdb) p event
$1 = (const struct ctf_event_definition *) 0x5f2f64616f6c6e79
(gdb) p* ctf_event
$2 = {parent = 0x5f2f64616f6c6e79}
(gdb) p* ctf_event->parent
Cannot access memory at address 0x5f2f64616f6c6e79
=====

#927010#10
Date:
2019-04-17 19:46:42 UTC
From:
To:
Hi,

This is a known limitation of the babeltrace 1 python bindings, you'll
have to either deep copy the events you want to do further processing on
or iterate multiple times on the trace collection.

This limitation will be fixed in the bt2 bindings and you'll be able to
keep references to events.

Regards,

Michael