I get a segmentation fault when trying to display an object of a class defined in a C extension.
In [1]: import moose
on node 0, numNodes = 1, numCores = 2
In [2]: a = moose.Neutral('a')
In [3]: print a
<moose.Neutral: id=459, dataIndex=0, path=/a[0]>
In [4]: a
Segmentation fault (core dumped)
I implemented repr
and str
functions in C, but using gdb
I figured that it does not even go to those functions. It works for another class in the same extension. Standard Python 2.7 interpreter also works fine.
print a
works in the IPython console.
I checked my refcounts and that does not seem to be problematic (PyObject_New
initializes the refcount to 1).
So what is the special thing that IPython is doing when I enter a variable identifier directly in the console that causes the segfault?
It is a pretty large module and a minimal example is nontrivial. The repr function definition is:
PyObject * moose_ObjId_repr(_ObjId * self)
{
if (!Id::isValid(self->oid_.id)){
RAISE_INVALID_ID(NULL, "moose_ObjId_repr");
}
ostringstream repr;
repr << "<moose." << Field<string>::get(self->oid_, "className") << ": "
<< "id=" << self->oid_.id.value() << ", "
<< "dataIndex=" << self->oid_.dataIndex << ", "
<< "path=" << self->oid_.path() << ">";
return PyString_FromString(repr.str().c_str());
} // ! moose_ObjId_repr
The gdb stack trace is below. Unfortunately I cannot use Python debug build because of a subtle issue in Python C-API. It looks like the segmentation fault occurs before control reaches a module function (the module is built with debug flags and if I do print a
then a break point on the repr
function catches it).
#0 0x000000000050ffab in ?? ()
#1 0x0000000000503cbc in ?? ()
#2 0x00000000004879ba in ?? ()
#3 0x000000000049968d in PyEval_EvalFrameEx ()
#4 0x00000000004a090c in PyEval_EvalCodeEx ()
#5 0x000000000049ab45 in PyEval_EvalFrameEx ()
#6 0x00000000004a090c in PyEval_EvalCodeEx ()
#7 0x000000000049ab45 in PyEval_EvalFrameEx ()
#8 0x00000000004a1c9a in ?? ()
#9 0x00000000004dfe94 in ?? ()
#10 0x0000000000505f96 in PyObject_Call ()
#11 0x00000000004dddad in ?? ()
#12 0x0000000000499be5 in PyEval_EvalFrameEx ()
#13 0x00000000004a090c in PyEval_EvalCodeEx ()
#14 0x0000000000499a52 in PyEval_EvalFrameEx ()
#15 0x00000000004a090c in PyEval_EvalCodeEx ()
#16 0x000000000049ab45 in PyEval_EvalFrameEx ()
#17 0x00000000004a1c9a in ?? ()
#18 0x00000000004dfe94 in ?? ()
#19 0x0000000000505f96 in PyObject_Call ()
#20 0x00000000004dddad in ?? ()
#21 0x00000000004dc9cb in PyEval_CallObjectWithKeywords ()
#22 0x000000000049cf17 in PyEval_EvalFrameEx ()
#23 0x00000000004a090c in PyEval_EvalCodeEx ()
#24 0x0000000000588d42 in PyEval_EvalCode ()
#25 0x000000000049e460 in PyEval_EvalFrameEx ()
#26 0x00000000004a090c in PyEval_EvalCodeEx ()
#27 0x000000000049ab45 in PyEval_EvalFrameEx ()
#28 0x00000000004a090c in PyEval_EvalCodeEx ()
#29 0x0000000000499a52 in PyEval_EvalFrameEx ()
#30 0x00000000004a090c in PyEval_EvalCodeEx ()
#31 0x0000000000499a52 in PyEval_EvalFrameEx ()
#32 0x00000000004a090c in PyEval_EvalCodeEx ()
#33 0x0000000000499a52 in PyEval_EvalFrameEx ()
#34 0x00000000004a090c in PyEval_EvalCodeEx ()
#35 0x0000000000499a52 in PyEval_EvalFrameEx ()
#36 0x00000000004a090c in PyEval_EvalCodeEx ()
#37 0x000000000049ab45 in PyEval_EvalFrameEx ()
#38 0x00000000004a1c9a in ?? ()
#39 0x0000000000505f96 in PyObject_Call ()
#40 0x000000000049b07a in PyEval_EvalFrameEx ()
#41 0x00000000004a090c in PyEval_EvalCodeEx ()
#42 0x0000000000499a52 in PyEval_EvalFrameEx ()
#43 0x00000000004a1634 in ?? ()
#44 0x000000000044e4a5 in PyRun_FileExFlags ()
#45 0x000000000044ec9f in PyRun_SimpleFileExFlags ()
#46 0x000000000044f904 in Py_Main ()
#47 0x00007ffff7818ec5 in __libc_start_main (main=0x44f9c2 <main>, argc=2, argv=0x7fffffffde28, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffde18) at libc-start.c:287
#48 0x0000000000578c4e in _start ()