public inbox for gdb-prs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/26145] New: Internal error showing _M_local_word in ostream
@ 2020-06-21  9:14 phma at bezitopo dot org
  0 siblings, 0 replies; only message in thread
From: phma at bezitopo dot org @ 2020-06-21  9:14 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=26145

            Bug ID: 26145
           Summary: Internal error showing _M_local_word in ostream
           Product: gdb
           Version: 8.3
            Status: UNCONFIRMED
          Severity: critical
          Priority: P2
         Component: c++
          Assignee: unassigned at sourceware dot org
          Reporter: phma at bezitopo dot org
  Target Milestone: ---

I'm debugging a program I'm writing, which has what appears to be a concurrency
bug. The stack trace is:

(gdb) where
#0  __memmove_avx_unaligned_erms ()
    at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:321
#1  0x00007ffff7e4a298 in std::char_traits<char>::copy (__n=4, 
    __s2=0x7ffff71a1900 "\377\177", __s1=<optimized out>)
    at
/build/gcc-9-NSfpi_/gcc-9-9.2.1/build/x86_64-linux-gnu/libstdc++-v3/include/bits/char_traits.h:365
#2  std::basic_streambuf<char, std::char_traits<char> >::xsputn (
    this=0x44f940 <octStore+24>, __s=0x7ffff71a1900 "\377\177", __n=4)
    at
/build/gcc-9-NSfpi_/gcc-9-9.2.1/build/x86_64-linux-gnu/libstdc++-v3/include/bits/streambuf.tcc:90
#3  0x00007ffff7e38a37 in std::basic_streambuf<char, std::char_traits<char>
>::sputn (__n=4, __s=<optimized out>, this=<optimized out>)
    at
/build/gcc-9-NSfpi_/gcc-9-9.2.1/build/x86_64-linux-gnu/libstdc++-v3/include/streambuf:457
#4  std::ostream::_M_write (__n=4, __s=<optimized out>, 
    this=0x44f938 <octStore+16>)
    at
/build/gcc-9-NSfpi_/gcc-9-9.2.1/build/x86_64-linux-gnu/libstdc++-v3/include/ostream:319
#5  std::ostream::write (this=0x44f938 <octStore+16>, 
    __s=0x7ffff71a1900 "\377\177", __n=4)
    at
/build/gcc-9-NSfpi_/gcc-9-9.2.1/build/x86_64-linux-gnu/libstdc++-v3/include/bits/ostream.tcc:196
#6  0x000000000040a6dd in writelefloat (file=..., f=4.59163468e-41)
    at /home/phma/src/wolkenbase/binio.cpp:198
#7  0x000000000040e6dd in LasPoint::write (this=0x518a20, file=...)
    at /home/phma/src/wolkenbase/las.cpp:108
#8  0x0000000000411dfd in OctBlock::write (this=0x49a098)
    at /home/phma/src/wolkenbase/octree.cpp:160
#9  0x0000000000412067 in OctBlock::flush (this=0x49a098)
    at /home/phma/src/wolkenbase/octree.cpp:199
#10 0x0000000000412bc4 in OctStore::getBlock (this=0x44f928 <octStore>, 
    block=23, mustExist=false) at /home/phma/src/wolkenbase/octree.cpp:320
#11 0x000000000041274e in OctStore::getBlock (this=0x44f928 <octStore>, 
    key=...) at /home/phma/src/wolkenbase/octree.cpp:337
#12 0x000000000041247e in OctStore::operator[] (this=0x44f928 <octStore>, 
    key=...) at /home/phma/src/wolkenbase/octree.cpp:260
#13 0x000000000042028f in WolkenThread::operator() (this=0x4a2c68, thread=1)
    at /home/phma/src/wolkenbase/threads.cpp:301

writelefloat, which is also in Bezitopo and PerfectTIN, is simply this:

void writebefloat(std::ostream &file,float f)
{
  char buf[4];
  *(float *)buf=f;
#ifndef BIGENDIAN
  endianflip(buf,4);
#endif
  file.write(buf,4);
}

So I do "frame 6", "print buf" (which says "\377\177\000" ­— the number is
0x00007fff) and "print file", which fails as follows:

$2 = (std::ostream &) @0x44f938: {<std::basic_ios<char, std::char_traits<char>
>> = {<std::ios_base> = {
      _vptr.ios_base = 0x7ffff7ee7248 <vtable for std::basic_fstream<char,
std::char_traits<char> >+104>, 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 = 6, 
      _M_width = 0, _M_flags = 0, _M_exception = std::_S_goodbit, 
      _M_streambuf_state = 33, _M_callbacks = 0x206e776f6e6b6e55, 
--Type <RET> for more, q to quit, c to continue without paging--
      _M_word_zero = {_M_pword = 0x3420646165726874, _M_iword = 46}, 
      _M_local_word = {
/build/gdb-6oQbwX/gdb-8.3/gdb/value.c:847: internal-error: bool
value_contents_bits_eq(const value*, int, const value*, int, int): Assertion
`offset1 + length <= TYPE_LENGTH (val1->enclosing_type) * TARGET_CHAR_BIT'
failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) n

Here is file dumped in hex:

(gdb) x/68xw &file
0x44f938 <octStore+16>:  0xf7ee7220 0x00007fff 0xf7ee6e88 0x00007fff
0x44f948 <octStore+32>:  0x004a0570 0x00000000 0x004a0570 0x00000000
0x44f958 <octStore+48>:  0x004a0570 0x00000000 0x00000000 0x00000000
0x44f968 <octStore+64>:  0x00000000 0x00000000 0x00000000 0x00000000
0x44f978 <octStore+80>:  0xf7eefc20 0x00007fff 0x00000000 0x00000000
0x44f988 <octStore+96>:  0x00000000 0x00000000 0x00000000 0x00000000
0x44f998 <octStore+112>: 0x00000000 0x00000000 0x00000000 0x00000000
0x44f9a8 <octStore+128>: 0x004a0380 0x00000000 0x00000001 0x00000000
0x44f9b8 <octStore+144>: 0x0000003c 0x00000000 0x00000000 0x00000000
0x44f9c8 <octStore+160>: 0x00000000 0x00000000 0x00000000 0x00000000
0x44f9d8 <octStore+176>: 0x004a0570 0x00000000 0x00002000 0x00000000
0x44f9e8 <octStore+192>: 0x00000001 0x00000000 0x00000000 0x00000000
0x44f9f8 <octStore+208>: 0x00000000 0x00000000 0x00000000 0x00000000
0x44fa08 <octStore+224>: 0xf7eef5b0 0x00007fff 0x00000000 0x00000000
0x44fa18 <octStore+240>: 0x00000000 0x00000000 0x00000000 0x00000000
0x44fa28 <octStore+256>: 0x00000000 0x00000000 0xf7ee7248 0x00007fff
0x44fa38 <octStore+272>: 0x00000006 0x00000000 0x00000000 0x00000000

file is actually an fstream, but is passed to writebefloat as an ostream. There
are two worker threads, and they have a mutex so that only one can read or
write the file at once.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-21  9:14 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-21  9:14 [Bug c++/26145] New: Internal error showing _M_local_word in ostream phma at bezitopo dot org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).