Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: i386 current upgrade and binary compatibility



On Friday 28 March 2008, Sverre Froyen wrote:
> On Thursday 27 March 2008, Mark Davies wrote:
...
> >
> > Moving forward we need to either identify what the actual ABI change was
> > and reverse it or bump the version number of the library.
>
> OK. I have a new libstdc++ built with -g and all my old binaries.  What can
> I do to help track this down?
>
> Here's a backtrace example from artsd segfaulting:
>
> Program received signal SIGSEGV, Segmentation fault.
> 0xbb606906 in std::ostream::flush (this=0xbb676620)
>     at /usr/src/gnu/dist/gcc4/libstdc++-v3/include/bits/basic_ios.h:308
> 308           { return _M_streambuf; }
> Current language:  auto; currently c++
>
> #0  0xbb606906 in std::ostream::flush (this=0xbb676620)
>     at /usr/src/gnu/dist/gcc4/libstdc++-v3/include/bits/basic_ios.h:308
> #1  0xbb623b56 in sentry (this=0xbfbfdbeb, __in=@0xbfbfdc58,
> __noskip=false) at
> /usr/src/gnu/dist/gcc4/libstdc++-v3/include/bits/istream.tcc:58 #2 
> 0xbb642da5 in std::operator>><char, std::char_traits<char>,
> std::allocator<char> > (__in=@0xbfbfdc58, __str=@0xbfbfdee0)
>     at /usr/src/gnu/dist/gcc4/libstdc++-v3/src/istream.cc:277
> #3  0xbb91fe60 in Arts::MCOPConfig::readListEntry ()
>    from /usr/pkg/lib/libmcop.so.1
> #4  0xbb917649 in readPath () from /usr/pkg/lib/libmcop.so.1
> #5  0xbb9177c5 in Arts::MCOPUtils::traderPath ()
> from /usr/pkg/lib/libmcop.so.1
> #6  0xbb922676 in Arts::TraderHelper::load () from
> /usr/pkg/lib/libmcop.so.1 #7  0xbb922730 in
> Arts::TraderHelper::TraderHelper ()
>    from /usr/pkg/lib/libmcop.so.1
> #8  0xbb922778 in Arts::TraderHelper::the () from /usr/pkg/lib/libmcop.so.1
> #9  0xbb9239c8 in Arts::TraderQuery_impl::query ()
>    from /usr/pkg/lib/libmcop.so.1
> #10 0x08062d9b in Arts::SimpleSoundServer_impl::SimpleSoundServer_impl ()
> #11 0x0805b416 in Arts::SoundServerV2_impl::SoundServerV2_impl ()
> #12 0x0805d7b3 in SoundServerV2_impl_Factory::createInstance ()
> #13 0xbb90f87d in Arts::ObjectManager::create ()
> from /usr/pkg/lib/libmcop.so.1
> #14 0xbbbb8ebc in Arts::SoundServerV2_base::_create ()

The segentaion fault happens because  __in._M_tie is bogus (see frame 1, 
above).  Here's a dump of __in:

(gdb) print __in
$1 = (class std::basic_istream<char,std::char_traits<char> >
     &) @0xbfbfdc58: {<std::basic_ios<char,std::char_traits<char> >> = 
{<std::ios_base> = {_vptr.ios_base = 0xbb673360, static boolalpha = 
std::_S_boolalpha,
      static dec = std::_S_dec, static fixed = std::_S_fixed,
      static hex = std::_S_hex, static internal = std::_S_internal,
      static left = std::_S_left, static oct = std::_S_oct,
      static right = std::_S_right, static scientific = std::_S_scientific,
      static showbase = std::_S_showbase,
      static showpoint = std::_S_showpoint, static showpos = std::_S_showpos,
      static skipws = std::_S_skipws, static unitbuf = std::_S_unitbuf,
      static uppercase = std::_S_uppercase,
      static adjustfield = std::_S_adjustfield,
      static basefield = std::_S_basefield,
      static floatfield = std::_S_floatfield, static badbit = std::_S_badbit,
      static eofbit = std::_S_eofbit, static failbit = std::_S_failbit,
      static goodbit = std::_S_goodbit, static app = std::_S_app,
      static ate = std::_S_ate, static binary = std::_S_bin,
      static in = std::_S_in, static out = std::_S_out,
      static trunc = std::_S_trunc, static beg = std::_S_beg,
      static cur = std::_S_cur, static end = std::_S_end,
      _M_precision = 134694080, _M_width = 6, _M_flags = 0,
      _M_exception = 4098, _M_streambuf_state = std::_S_goodbit,
      _M_callbacks = 0x0, _M_word_zero = {_M_pword = 0x0, _M_iword = 0},
      _M_local_word = {{_M_pword = 0x0, _M_iword = 0}, {_M_pword = 0x0,
          _M_iword = 0}, {_M_pword = 0x0, _M_iword = 0}, {_M_pword = 0x0,
          _M_iword = 0}, {_M_pword = 0x0, _M_iword = 0}, {_M_pword = 0x0,
          _M_iword = 0}, {_M_pword = 0x0, _M_iword = 0}, {_M_pword = 0x0,
          _M_iword = 0}}, _M_word_size = 0, _M_word = 0x8, _M_ios_locale = {
        static none = 0, static ctype = 1, static numeric = 2,
        static collate = 4, static time = 8, static monetary = 16,
        static messages = 32, static all = 63, _M_impl = 0xbfbfde74,
        static _S_classic = 0xbb676620, static _S_global = 0xbb676620,
        static _S_categories = 0xbb671064, static _S_once = {pto_mutex = {
            ptm_magic = 858980355, ptm_errorcheck = 0, ptm_recursed = 0,
            ptm_waiters = 0x0, ptm_owner = 0x0}, pto_done = 1}}},
    _M_tie = 0xbb676620, _M_fill = 0 '\0', _M_fill_init = false,
    _M_streambuf = 0xbfbf0000, _M_ctype = 0xbfbfdc60, _M_num_put = 0xbb676760,
    _M_num_get = 0xbb6769a0}, _vptr.basic_istream = 0x80744ac, _M_gcount = 0}

Notice that the address 0xbb676620 is pointed to by _M_tie as well as several 
other members.  In fact, 0xbb676620 contains the global variable 
__gnu_internal::c_locale_impl.

(gdb) print __in._M_tie
$2 = (class std::basic_ostream<char,std::char_traits<char> > *) 0xbb676620
(gdb) x 0xbb676620
0xbb676620 <_ZN14__gnu_internal13c_locale_implE>:       0x00000012

(std::ostream::flush attempts to use the 0x12 as an address causing the 
violation)

I attemped to add a breakpoint at (all) the std::basic_istream constructors in 
libstdc++, but either I missed one or it is never called!?

Does this ring a bell with any one?  Suggestions?

Thanks,
Sverre

PS I see some weirdness with gdb.  stepi in most cases work like continue and 
some times gdb places itself in the background (an fg seems to restore it 
properly).



Home | Main Index | Thread Index | Old Index