Archived
This forum has been archived. Please start a new discussion on GitHub.
Segfault (using Python bindings)
When using MySQLdb(Python mysql bindings) with Ice segfaults or python errors occur upon terminating a program with SIGINT.
Most of the time the program segfaults, sometimes it displays one of the following error messages:
Fatal Python error: ceval: tstate mix-up
and
Fatal Python error: GC object already tracked
Traceback (most recent call last):
Aborted
The OS is Ubuntu 6.06 (Dapper Drake) running on a dual processor machine.
Ice and IcePy version is 3.2.0, compiled with gcc 4.0.3
Python version is 2.4.3, MySQLdb version is 1.2.1rc3
(all packages except Ice are stock distro packages)
Testcase:
whatever.ice :
config.server :
testcase.py :
The segfault occurs upon terminating via Ctrl-C or kill -INT pid
Stacktrace upon receiving SIGSEGV:
Most of the time the program segfaults, sometimes it displays one of the following error messages:
Fatal Python error: ceval: tstate mix-up
and
Fatal Python error: GC object already tracked
Traceback (most recent call last):
Aborted
The OS is Ubuntu 6.06 (Dapper Drake) running on a dual processor machine.
Ice and IcePy version is 3.2.0, compiled with gcc 4.0.3
Python version is 2.4.3, MySQLdb version is 1.2.1rc3
(all packages except Ice are stock distro packages)
Testcase:
whatever.ice :
module Whatever { interface Widget { void doSomething (); }; };
config.server :
Whatever.Endpoints = tcp -p 10000
testcase.py :
#!/usr/bin/env python # -*- encoding: utf-8 -*- import sys, Ice, MySQLdb Ice.loadSlice ("whatever.ice") import Whatever class WidgetI (Whatever.Widget): def __init__ (self): self.db = MySQLdb.connect (user="", passwd="") # your db config here self.cursor = self.db.cursor() # doesn't segfault when this line is removed def doSomething (self, current=None): return def shutdown (self, current=None): # never reached self.cursor.close() self.db.close() current.adapter.getCommunicator().shutdown() class Server (Ice.Application): def run (self, args): adapter = self.communicator().createObjectAdapter("Whatever") adapter.add (WidgetI(), self.communicator().stringToIdentity("Widget")) adapter.activate() self.communicator().waitForShutdown() return 0 app = Server(); sys.exit (app.main (sys.argv, "config.server"))
The segfault occurs upon terminating via Ctrl-C or kill -INT pid
Stacktrace upon receiving SIGSEGV:
#0 0x080c963b in PyErr_Fetch () #1 0x0809583c in PyType_Ready () #2 0x08089d4b in _PyType_Lookup () #3 0x0807a335 in PyDict_Next () #4 0x08089f7b in _PyType_Lookup () #5 0xb7bfe410 in ~ServantWrapper (this=0x81f9d28) at ObjectAdapter.cpp:126 #6 0xb7a4e0b4 in IceInternal::GCShared::__decRef (this=0x81f9d4c) at GC.cpp:91 #7 0xb7aba0b2 in IceInternal::decRef (p=0x81f9d4c) at Object.cpp:21 #8 0xb7c01f08 in ~Handle (this=0x81f9cfc) at Handle.h:91 #9 0xb7c03643 in ~pair (this=0x81f9cf8) at stl_pair.h:69 #10 0xb7c0369f in __gnu_cxx::new_allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > >::destroy (this=0xb72ce37f, __p=0x81f9cf8) at new_allocator.h:107 #11 0xb7c0373b in std::_Rb_tree<std::string, std::pair<std::string const, IceInternal::Handle<Ice::Object> >, std::_Select1st<std::pair<std::string const, IceInternal::Handle<Ice::Object> > >, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > >::destroy_node (this=0x81f0e70, __p=0x81f9ce8) at stl_tree.h:389 #12 0xb7c037ce in std::_Rb_tree<std::string, std::pair<std::string const, IceInternal::Handle<Ice::Object> >, std::_Select1st<std::pair<std::string const, IceInternal::Handle<Ice::Object> > >, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > >::_M_erase (this=0x81f0e70, __x=0x81f9ce8) at stl_tree.h:1097 #13 0xb7c0380d in ~_Rb_tree (this=0x81f0e70) at stl_tree.h:571 #14 0xb7c038b1 in ~map (this=0x81f0e70) at stl_map.h:92 #15 0xb7b00be3 in ~pair (this=0x81f0e68) at stl_pair.h:69 #16 0xb7b00c3f in __gnu_cxx::new_allocator<std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > > >::destroy (this=0xb72ce46f, __p=0x81f0e68) at new_allocator.h:107 #17 0xb7b00e65 in std::_Rb_tree<Ice::Identity, std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > >, std::_Select1st<std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > > >, std::less<Ice::Identity>, std::allocator<std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > > > >::destroy_node ( this=0xb72ce604, __p=0x81f0e58) at stl_tree.h:389 #18 0xb7b00ef8 in std::_Rb_tree<Ice::Identity, std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > >, std::_Select1st<std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > > >, std::less<Ice::Identity>, std::allocator<std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > > > >::_M_erase ( this=0xb72ce604, __x=0x81f0e58) at stl_tree.h:1097 #19 0xb7b00fc7 in std::_Rb_tree<Ice::Identity, std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > >, std::_Select1st<std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > > >, std::less<Ice::Identity>, std::allocator<std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > > > >::clear (this=0xb72ce604) at stl_tree.h:667 #20 0xb7b0103b in std::map<Ice::Identity, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > >, std::less<Ice::Identity>, std::allocator<std::pair<Ice::Identity const, std::map<std::string, IceInternal::Handle<Ice::Object>, std::less<std::string>, std::allocator<std::pair<std::string const, IceInternal::Handle<Ice::Object> > > > > > >::clear (this=0xb72ce604) at stl_map.h:465 #21 0xb7afe19c in IceInternal::ServantManager::destroy (this=0x81ccdb0) at ServantManager.cpp:374 #22 0xb7aa8e86 in Ice::ObjectAdapterI::destroy (this=0x81ccce8) at ObjectAdapterI.cpp:329 #23 0xb7aa167f in IceUtilInternal::SecondVoidMemFun<std::string const, Ice::ObjectAdapterI, IceUtil::Handle<Ice::ObjectAdapterI> >::operator() (this=0xb72ce6fc, pair=@0xb72ce6d8) at Functional.h:125 #24 0xb7aa16c7 in std::for_each<std::_Rb_tree_iterator<std::pair<std::string const, IceUtil::Handle<Ice::ObjectAdapterI> > >, IceUtilInternal::SecondVoidMemFun<std::string const, Ice::ObjectAdapterI, IceUtil::Handle<Ice::ObjectAdapterI> > > (__first={_M_node = 0x81fb4b0}, __last={_M_node = 0xb72ce73c}, __f= {<std::unary_function<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, IceUtil::Handle<Ice::ObjectAdapterI> >,void>> = {<No data fields>}, _mfn = {__pfn = 0x39, __delta = 0}}) at stl_algo.h:158 #25 0xb7aa07fc in IceInternal::ObjectAdapterFactory::destroy (this=0x81d77a0) at ObjectAdapterFactory.cpp:127 #26 0xb7a6591f in IceInternal::Instance::destroy (this=0x81dbf08) at Instance.cpp:847 #27 0xb7a13e34 in Ice::CommunicatorI::destroy (this=0x81ab3e0) at CommunicatorI.cpp:74 #28 0xb7becbeb in communicatorDestroy (self=0xb74cea60) at Communicator.cpp:286 #29 0x080b606f in PyEval_EvalFrame () #30 0x080b713b in PyEval_EvalFrame () #31 0x080b713b in PyEval_EvalFrame () #32 0x080b713b in PyEval_EvalFrame () #33 0x080b781f in PyEval_EvalCodeEx () #34 0x080fc13d in PyFunction_SetClosure () #35 0x0805946c in PyObject_Call () #36 0x0805f005 in PyMethod_New () #37 0x0805946c in PyObject_Call () #38 0x080b0583 in PyEval_CallObjectWithKeywords () #39 0x080e074d in _PyObject_GC_NewVar () #40 0xb7f6a341 in start_thread () from /lib/tls/i686/cmov/libpthread.so.0 #41 0xb7ed74ee in clone () from /lib/tls/i686/cmov/libc.so.6
0
Comments
-
Thanks for the bug report. We've duplicated the error and are looking into it.0
-
Hi,
The crash is caused by a bug in the Ice extension. We will include a fix in the next release. If you want to fix this yourself, change to the IcePy source tree and open modules/ObjectAdapter.cpp. Around line 124, change the ServantWrapper destructor to the following:IcePy::ServantWrapper::~ServantWrapper() { AdoptThread adoptThread; // ADD THIS LINE Py_DECREF(_servant); }
Thanks for reporting this.
Take care,
- Mark0 -
Yes, it works now, thank you.0