There are some outstanding issues with the auxiliary streams in 
OBConversion and this may be a symptom. On the openbabel-Devel list 
Gert Thijs, and others, have identified problems with 
OBConversion::Read(OBBase* pOb, std::istream* pin=NULL)
He recommends that just the form like Read(&mol) should be used and 
the input stream set separately. The same might be done with Write().

Possibly this could help to avoid your crash.

Chris

On 28/09/2010 14:57, Steffen Neumann wrote:
> Hi,
>
> we're currently using the OB in the PostgreSQL chemistry
> contrib module http://pgfoundry.org/projects/pgchem
> and we seem to hit a problem somewhere, see logs below.
>
> The code that is misbehaving is at the interface between OB and postgres,
> and the actual segfault is in the destructor of the OBConversion() result,
> but I am unsure whether the caller or the callee causes the problem,
> so this mail's subject might be a bit misleading.
> OB version is 2.2.3, compiled on g++-4.4.3 (Ubuntu 10.04)
>
> Unfortunately it is not a specific molecule that breaks,
> but the failure seems to be sporadic, some kind of memory corruption.
> I was able to obtain a stacktrace via gdb -- see the end of the mail -- but I 
> have no clue
> what this translates to. Some comments on things I figured are inlined in the 
> stacktrace.
> The offending code is also at the end of the mail.
>
> There, OBConversion is used to convert SetInAndOutFormats ("SMI", "MDL");
> and the SEGV occurs in the destructor of the ostringstream molstream object,
> which was the target of the conversion. Specifically it is the destructor
> ~basic_ostringstream, during its destruction it wants to release its 
> ~basic_stringbuf
> and the ~basic_string therein, which seems to be the ultimate failure
> (I am not proficient in stack traces, is that something free'd twice,
> or free'ing something that wasn't alloced before ? And there is
> another ~basic_string further up the stack trace ?!)
>
> My suspicion was that some dark pointer magic inside OBConversion
> causes the problem. what is the best practise in OB
> for hunting memory problems ? I get many issues through valgrind,
> again I am unable to pinpoint which might be the root cause.
> Maybe some experienced C++ hacker can deduce something
> from the stacktrace.
>
> Thanks for any pointers in advance,
>
> Yours,
> Steffen
>
> (gdb) where
> #0  0x00007f3ece7cb15e in ?? () from /lib/libc.so.6
> #1  0x00007f3ece7543ac in ?? () from /lib/libc.so.6
> #2  0x00007f3ece752e48 in free () from /lib/libc.so.6
> #3  0x00007f3ec9d6f129 in std::string::_Rep::_M_dispose (this=<value 
> optimized out>, __in_chrg=<value optimized out>)
>      at 
> /build/buildd/gcc-4.4-4.4.3/build/x86_64-linux-gnu/libstdc++-v3/include/bits/basic_string.h:231
> #4  ~basic_string (this=<value optimized out>, __in_chrg=<value optimized 
> out>)
>      at 
> /build/buildd/gcc-4.4-4.4.3/build/x86_64-linux-gnu/libstdc++-v3/include/bits/basic_string.h:498
> #5  0x00007f3ece70e262 in exit () from /lib/libc.so.6
> #6  0x00007f3ed07d2765 in quickdie ()
> #7<signal handler called>
> #8  0x00007f3ece7b304a in brk () from /lib/libc.so.6
> #9  0x00007f3ece7b30fd in sbrk () from /lib/libc.so.6
> #10 0x00007f3ece7545f9 in __default_morecore () from /lib/libc.so.6
> #11 0x00007f3ece74f694 in ?? () from /lib/libc.so.6
> #12 0x00007f3ece752e53 in free () from /lib/libc.so.6
> # Destructor cascade of ostringstream molstream
> #13 0x00007f3ec9d6b363 in std::string::_Rep::_M_dispose (this=0x7fff02c16a20, 
> __in_chrg=<value optimized out>, __vtt_parm=<value optimized out>)
>      at 
> /build/buildd/gcc-4.4-4.4.3/build/x86_64-linux-gnu/libstdc++-v3/include/bits/basic_string.h:231
> #14 ~basic_string (this=0x7fff02c16a20, __in_chrg=<value optimized out>, 
> __vtt_parm=<value optimized out>)
>      at 
> /build/buildd/gcc-4.4-4.4.3/build/x86_64-linux-gnu/libstdc++-v3/include/bits/basic_string.h:498
> #15 ~basic_stringbuf (this=0x7fff02c16a20, __in_chrg=<value optimized out>, 
> __vtt_parm=<value optimized out>)
>      at 
> /build/buildd/gcc-4.4-4.4.3/build/x86_64-linux-gnu/libstdc++-v3/include/iosfwd:63
> #16 ~basic_ostringstream (this=0x7fff02c16a20, __in_chrg=<value optimized 
> out>, __vtt_parm=<value optimized out>)
>      at 
> /build/buildd/gcc-4.4-4.4.3/build/x86_64-linux-gnu/libstdc++-v3/include/sstream:432
> # From here on the postgres-OpenBabel glue stuff
> #17 0x00007f3ecaa8f5c9 in ob_smiles_to_mol () from 
> /usr/lib/postgresql/9.0/lib/libpgchem.so
> #18 0x00007f3ecaa87ee0 in make_molecule (
>      raw_input=0x7f3ed35a8c0c 
> "CS(=O)(=O)C1=C(C=CC2=CC=CC=C21)NN=C3C(=CC4=CC(=CC(=C4C3=O)NC5=NC(=NC(=N5)NC6=C(C=C(C=C6)S(=O)(=O)O)C(=O)O)Cl)S(=O)(=O)O)S(=O)(=O)O)(=O)[O-]N(C)C2O/c1-6-10(2,3)9(13)11-7-8-1`)\326\322>\177",
>  size=<value optimized out>) at molecule/molecule_io.c:483
> #19 0x00007f3ed071c618 in ?? ()
> # From here on Postgres stuff
> #20 0x00007f3ed07179ee in ExecProject ()
> #21 0x00007f3ed072d50b in ExecResult ()
> #22 0x00007f3ed0716fd8 in ExecProcNode ()
> #23 0x00007f3ed072bd6d in ExecModifyTable ()
> #24 0x00007f3ed0716fc8 in ExecProcNode ()
> #25 0x00007f3ed0715c82 in standard_ExecutorRun ()
> #26 0x00007f3ed07d6e07 in ?? ()
> #27 0x00007f3ed07d7038 in ?? ()
> #28 0x00007f3ed07d78e2 in PortalRun ()
> #29 0x00007f3ed07d4f6c in PostgresMain ()
> #30 0x00007f3ed07a005a in ?? ()
> #31 0x00007f3ed07a29f1 in PostmasterMain ()
> #32 0x00007f3ed0747923 in main ()
>
> ############################################################################
> #
> # At the end of this function the destructur experiences the SEGV
>
>
> extern "C" char *
> ob_smiles_to_mol (char *smiles)
> {
>    OBMol mol;
>    OBConversion conv;
>    string tmpStr (smiles);
>    string outstring;
>    istringstream smilesstream (tmpStr);
>    ostringstream molstream;
>    char *tmpMolfile;
>
>    conv.SetInAndOutFormats ("SMI", "MDL");
>
>    conv.Read (&mol,&smilesstream);
>
>    if (mol.Empty ())
>      return NULL;
>
>    conv.Write (&mol,&molstream);
>
>    outstring = molstream.str ();
>
>    // remove the trailling $$$$\n from the SDFile
>    if (outstring.find ("$$$$\n", 0) != string::npos)
>      {
>        outstring = outstring.substr (0, outstring.length () - 5);
>      }
>    else if (outstring.find ("$$$$\r\n", 0) != string::npos)
>      {
>        outstring = outstring.substr (0, outstring.length () - 6);
>      }
>
>    tmpMolfile = strdup (outstring.c_str ());
>    assert(tmpFile != NULL);
>
>    return (tmpMolfile);
> }
>
>
>
>
>
> No virus found in this incoming message.
> Checked by AVG - www.avg.com
> Version: 9.0.856 / Virus Database: 271.1.1/3163 - Release Date: 09/27/10 
> 18:56:00
>


------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
OpenBabel-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbabel-discuss

Reply via email to