Segfaults with boost::python::tuple during simulation loop

Bug #1764424 reported by Jérôme Duriez on 2018-04-16
This bug affects 1 person
Affects Status Importance Assigned to Milestone

Bug Description


I'm currently facing segmentation fault when using "my" MeasureCapStress post-processing engine (this constitutes a regression..).

A example script appears at the end of this message (it's better, though not necessary here, to have the capillary files from I get the crash with the trunk version as of today or yadedaily (for instance), and having Python 2.7.12 installed on my machine.

There is some random pattern in the way crashs occur, with e.g. the following messages:
- *** Error in `/usr/bin/python': free(): invalid pointer: 0x00000000008fa220 ***
followed by plenty of "Backtrace" and "Memory map" lines ending with "Aborted (core dumped)"
- or just "Segmentation fault (core dumped)"
that appear after a variable number (not much, though) of iterations.

It seems also possible to go through a greater number of iterations by hand-clicking on GUI step button than by asking

Anyway, the crash seems to occur during (or just after) the definition of a boost::python::tuple variable, equal to Shop::aabbExtrema(), at [*].

I'm quite puzzled by all this, would someone have an idea ?
Is there any particular (de-allocating ?) practice to follow when using such Python-C interfaced variables in the C++ code ?

Thank you very much,


### Script example ###
# two contacting particles with a capillary bridge inbetween. Segfaults because of MeasureCapStress on my machine
r1,r2 = 1e-4,4e-4


### End of script example ###

[*] While another boost:python: appears L64, it seems L63 is enough to cause the crash. Indeed, crash also occurs when just hardcoding in L64 "volume = 1.0;" (making L63 useless but still annoying enough to cause the crash)

Bruno Chareyre (bruno-chareyre) wrote :

Hi Jérôme,
It seems related to manipulating this python tuple as a c++ object.
First, I did not see any "[]" operator for tuples in boost documentation.
Second, even if it works I'm unsure it will automatically return the correct type (a Vector3r), hence this syntax may not do what you think:
double V = tuple[i][j]
Third, you incuded a boost::python::extract(something) but the "something" is already an ordinary c++ double hence the extract is useless.
boost::python::extract is probably what you need but it should come earlier when extracting the Vector3r.
Just my guess. I hope it helps.

summary: - MeasureCapStress-caused segmentation fault (boost::python)
+ Segfaults with boost::python::tuple during simulation loop
Jérôme Duriez (jduriez) wrote :


Thank you very much Bruno for the links and hints, I understand there probably is some bad practice here (see 3.).

However, I'm quite sure the crash is just caused by the following line
"boost::python::tuple extrema = Shop::aabbExtrema();" [1]

I thus suspect incorrect Python/C++ extraction or items access are not the reason of the present crash ?

Actually, I would like to point out the following "funny" fact:

2.1. Asking
**********,True) # => crash
********** at the end of the above MWE triggers (in one call to MeasureCapStress) the crash. (same with

2.2. Asking
for i in range(0,100):
    O.step() # => no crash
instead of does not trigger any crash. The ~100 calls to MeasureCapStress pass like a charm..

The syntax I used in this MeasureCapStress code was directly inspired from what is done in getPorosity() [2], getStress() [3], or fabricTensor() [4] utils functions (which work, I guess).
It's true none of those was probably intended to be used "within" the simulation loop, though..



[1] if you would just add this line in NewtonIntegrator::action() (with the correct "include<pkg/dem/Shop.hpp>"), same kind of segfaults would occur

Jérôme Duriez (jduriez) wrote :

For the record, see also https://<email address hidden>/msg13223.html

Jan Stránský (honzik) wrote :

Hi Jerome,

to find where the segfault problem comes from, you can run
catchsegv yade
the output tells the last actions before the segfault.
If the output is too long, you can try
catchsegv yade > /tmp/segv.err
catchsegv yade 2> /tmp/segv.err
(don't remember) and provde the segv.err file


PS: this is exactly the point I mentioned in [1]. If you use these functions in C++, using boost::python stuff is extra, std::vector should be used instead of boost::python::tuple and the buust::python stuff should only be used to interact with Python :-)

[1] https://<email address hidden>/msg13300.html

Jérôme Duriez (jduriez) wrote :

Initial MeasureCapStress problem fixed in commit 68b0557.

The possible use of e.g. boost::python::extract during Engine::action() (see the link in #3) remains to be explored, as far as I'm concerned.

Changed in yade:
status: New → Fix Released
To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Other bug subscribers