Mail Archives: djgpp/2002/11/10/15:15:02
>Ok. Now do "br 0x0001f47f" or "br *0x0001f47f" (I forget the exact
>syntax) and "run". Now you should stop just before the crash. Examine
>the registers and figure out what's wrong. Do "disass 0x0001f47f" or
>"disass *0x0001f47f" to see the exact machine instruction that
>crashes.
C:\Archives\RIP2\DJGPP\bin>gdb wel-g.exe
GNU gdb 5.2.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i386-pc-msdosdjgpp"...
(gdb) run
Starting program: c:/Archives/RIP2/DJGPP/bin/wel-g.exe
Program received signal SIGSEGV, Segmentation fault.
0x0001e1df in std::ostream::sentry::sentry(std::ostream&) ()
(gdb) n
Single stepping until exit from function _ZNSo6sentryC1ERSo,
which has no line number information.
Exiting due to signal SIGSEGV
General Protection Fault at eip=0001e1df
eax=00000000 ebx=00043b58 ecx=00043b58 edx=000c7f60 esi=00000054
edi=00001630
ebp=000c7f28 esp=000c7f24 program=c:\Archives\RIP2\DJGPP\bin\wel-g.exe
cs: sel=01ef base=022c0000 limit=000cffff
ds: sel=01f7 base=022c0000 limit=000cffff
es: sel=01f7 base=022c0000 limit=000cffff
fs: sel=01e7 base=0001a250 limit=00003fff
gs: sel=0207 base=00000000 limit=0010ffff
ss: sel=01f7 base=022c0000 limit=000cffff
App stack: [000c7fdc..00047fdc] Exceptn stack: [00047e8c..00045f4c]
Call frame traceback EIPs:
0x0001e1df
0x0001e44e
0x0000167e
0x0000d817
Program exited with code 0377.
(gdb) br *0x0001e1df
Breakpoint 1 at 0x1e1df
(gdb) run
Starting program: c:/Archives/RIP2/DJGPP/bin/wel-g.exe
Breakpoint 1, 0x0001e1df in
std::ostream::sentry::sentry(std::ostream&) ()
(gdb) disass 0x0001e1df
Dump of assembler code for function _ZNSo6sentryC1ERSo:
0x1e1d0 <_ZNSo6sentryC1ERSo>: push %ebp
0x1e1d1 <_ZNSo6sentryC1ERSo+1>: mov %esp,%ebp
0x1e1d3 <_ZNSo6sentryC1ERSo+3>: push %ebx
0x1e1d4 <_ZNSo6sentryC1ERSo+4>: mov 0xc(%ebp),%ecx
0x1e1d7 <_ZNSo6sentryC1ERSo+7>: mov 0x8(%ebp),%edx
0x1e1da <_ZNSo6sentryC1ERSo+10>: mov (%ecx),%eax
0x1e1dc <_ZNSo6sentryC1ERSo+12>: mov %ecx,0x4(%edx)
0x1e1df <_ZNSo6sentryC1ERSo+15>: mov 0xfffffff4(%eax),%ebx
0x1e1e2 <_ZNSo6sentryC1ERSo+18>: lea (%ebx,%ecx,1),%eax
0x1e1e5 <_ZNSo6sentryC1ERSo+21>: mov 0x14(%eax),%ebx
0x1e1e8 <_ZNSo6sentryC1ERSo+24>: test %ebx,%ebx
0x1e1ea <_ZNSo6sentryC1ERSo+26>: sete %al
0x1e1ed <_ZNSo6sentryC1ERSo+29>: movzbl %al,%eax
0x1e1f0 <_ZNSo6sentryC1ERSo+32>: test %al,%al
0x1e1f2 <_ZNSo6sentryC1ERSo+34>: mov %al,(%edx)
0x1e1f4 <_ZNSo6sentryC1ERSo+36>: je 0x1e210
<_ZNSo6sentryC1ERSo+64>
0x1e1f6 <_ZNSo6sentryC1ERSo+38>: mov (%ecx),%eax
0x1e1f8 <_ZNSo6sentryC1ERSo+40>: mov 0xfffffff4(%eax),%edx
0x1e1fb <_ZNSo6sentryC1ERSo+43>: add %edx,%ecx
0x1e1fd <_ZNSo6sentryC1ERSo+45>: mov 0x70(%ecx),%eax
0x1e200 <_ZNSo6sentryC1ERSo+48>: test %eax,%eax
0x1e202 <_ZNSo6sentryC1ERSo+50>: je 0x1e210
<_ZNSo6sentryC1ERSo+64>
0x1e204 <_ZNSo6sentryC1ERSo+52>: mov %eax,0x8(%ebp)
0x1e207 <_ZNSo6sentryC1ERSo+55>: pop %ebx
0x1e208 <_ZNSo6sentryC1ERSo+56>: pop %ebp
0x1e209 <_ZNSo6sentryC1ERSo+57>: jmp 0x1dde0 <_ZNSo5flushEv>
0x1e20e <_ZNSo6sentryC1ERSo+62>: mov %esi,%esi
0x1e210 <_ZNSo6sentryC1ERSo+64>: pop %ebx
0x1e211 <_ZNSo6sentryC1ERSo+65>: pop %ebp
0x1e212 <_ZNSo6sentryC1ERSo+66>: ret
0x1e213 <_ZNSo6sentryC1ERSo+67>: nop
0x1e214 <_ZNSo6sentryC1ERSo+68>: nop
0x1e215 <_ZNSo6sentryC1ERSo+69>: nop
0x1e216 <_ZNSo6sentryC1ERSo+70>: nop
0x1e217 <_ZNSo6sentryC1ERSo+71>: nop
0x1e218 <_ZNSo6sentryC1ERSo+72>: nop
0x1e219 <_ZNSo6sentryC1ERSo+73>: nop
0x1e21a <_ZNSo6sentryC1ERSo+74>: nop
0x1e21b <_ZNSo6sentryC1ERSo+75>: nop
0x1e21c <_ZNSo6sentryC1ERSo+76>: nop
0x1e21d <_ZNSo6sentryC1ERSo+77>: nop
0x1e21e <_ZNSo6sentryC1ERSo+78>: nop
0x1e21f <_ZNSo6sentryC1ERSo+79>: nop
End of assembler dump.
(gdb)
>Get the C++ file that contains that
>std::ostream::sentry::sentry(std::ostream&) () and add it to the
>compile line after welcome.cpp. Now you might get the source
>displayed.
No C++ file contains std::ostream::sentry::sentry(std::ostream&) ()
Here are some greps that returned files.
cd /usr/local/compiler/cross4/djgpp
grep -lr . -e '::sentry::'
./include/c++/3.2/bits/istream.tcc
./include/c++/3.2/bits/ostream.tcc
These are header files.
grep -lr . -e 'sentry'
./i686-pc-msdosdjgpp/lib/libstdcxx.a
./i686-pc-msdosdjgpp/lib/libstdc++.a
./lib/gcc-lib/i686-pc-msdosdjgpp/3.2/cc1plus
./include/c++/3.2/bits/istream.tcc
./include/c++/3.2/bits/ostream.tcc
./include/c++/3.2/bitset
./include/c++/3.2/istream
./include/c++/3.2/ostream
grep -lr . -e '_ZNSo6sentryC1ERSo'
./i686-pc-msdosdjgpp/lib/libstdcxx.a
./i686-pc-msdosdjgpp/lib/libstdc++.a
More detailed directory listings of those files.
ls -l $(echo $(grep -lr . -e '::sentry::'))
-rw-r--r-- 1 root root 35353 Nov 10 11:48
./include/c++/3.2/bits/istream.tcc
-rw-r--r-- 1 root root 20812 Nov 10 11:48
./include/c++/3.2/bits/ostream.tcc
ls -l $(echo $(grep -lr . -e 'sentry'))
-rw-r--r-- 1 root root 3708034 Nov 10 11:49
./i686-pc-msdosdjgpp/lib/libstdc++.a
lrwxrwxrwx 1 root root 11 Nov 10 11:51
./i686-pc-msdosdjgpp/lib/libstdcxx.a -> libstdc++.a
-rw-r--r-- 1 root root 35353 Nov 10 11:48
./include/c++/3.2/bits/istream.tcc
-rw-r--r-- 1 root root 20812 Nov 10 11:48
./include/c++/3.2/bits/ostream.tcc
-rw-r--r-- 1 root root 33917 Nov 10 11:49
./include/c++/3.2/bitset
-rw-r--r-- 1 root root 8757 Nov 10 11:49
./include/c++/3.2/istream
-rw-r--r-- 1 root root 8481 Nov 10 11:49
./include/c++/3.2/ostream
-rwxr-xr-x 1 root root 7643951 Nov 10 11:48
./lib/gcc-lib/i686-pc-msdosdjgpp/3.2/cc1plus*
ls -l $(echo $(grep -lr . -e '_ZNSo6sentryC1ERSo'))
-rw-r--r-- 1 root root 3708034 Nov 10 11:49
./i686-pc-msdosdjgpp/lib/libstdc++.a
lrwxrwxrwx 1 root root 11 Nov 10 11:51
./i686-pc-msdosdjgpp/lib/libstdcxx.a -> libstdc++.a
Just as a sidenote (possibly re-iterated)
The SIGSEGV occurs only when I include the iostream header (I haven't
tested any others yet) from the C++ standard library in my program.
The g++ compiler builds the exectutable without error, but the
executable segment faults when I try to run it under DOS or Win32.
The SIGSEGV does not occur when I include C standard library headers.
gcc and g++ cross compiled executables built using only Standard C
headers run fine under DOS and Win32.
Could this problem be resulting from the libstdc++.a archive library
having a name that defies DOS naming conventions? .. just a shot in
the dark
Another question WRT the FAQ at:
http://www.delorie.com/djgpp/v2faq/faq22_9.html
One of the steps WRT the build.cross script (which I haven't tried)
is:
DJGPP C++ headers (from the gppNNNb.zip package) are in the
prefix/i586-pc-msdosdjgpp/lang/cxx directory;
I have not done this.. Should I be?
I have been building soley from the gcc-3.2 release sources.
Charles
- Raw text -