[SDL] Need help tracking down a SegFault

Michael Sullivan michael at espersunited.com
Sun Feb 24 10:00:37 PST 2008


On Sun, 2008-02-24 at 18:26 +0100, Erik wrote:
> Michael Sullivan skrev:
> > michael at camille ourrpg $ valgrind ./main
> > ==14210== Memcheck, a memory error detector.
> > ==14210== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et
> > al.
> > ==14210== Using LibVEX rev 1732, a library for dynamic binary
> > translation.
> > ==14210== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
> > ==14210== Using valgrind-3.2.3, a dynamic binary instrumentation
> > framework.
> > ==14210== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et
> > al.
> > ==14210== For more details, rerun with: -v
> > ==14210== 
> > ==14210== Syscall param write(buf) points to uninitialised byte(s)
> > ==14210==    at 0x40DD69E: write (in /lib/libpthread-0.10.so)
> > ==14210==    by 0x458DE7D: (within /usr/lib/libX11.so.6.2.0)
> > ==14210==  Address 0x465897B is 19 bytes inside a block of size 16,384
> > alloc'd
> > ==14210==    at 0x4021ABE: calloc
> > (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
> > ==14210==    by 0x45731B3: XOpenDisplay (in /usr/lib/libX11.so.6.2.0)
> > ==14210== 
> > ==14210== Conditional jump or move depends on uninitialised value(s)
> > ==14210==    at 0x80498A0: Battle::initialize()
> > (in /home/michael/ourrpg/main)
> > ==14210==    by 0x804AEE0: main (in /home/michael/ourrpg/main)
> > Line is 65; i = 0
> > ==14210== 
> > ==14210== Use of uninitialised value of size 4
> > ==14210==    at 0x80498D6: Battle::initialize()
> > (in /home/michael/ourrpg/main)
> > ==14210==    by 0x804AEE0: main (in /home/michael/ourrpg/main)
> > ==14210== 
> > ==14210== Invalid read of size 4
> > ==14210==    at 0x407F752: SDL_MapRGB (in /usr/lib/libSDL-1.2.so.0.11.0)
> > ==14210==    by 0x80498F8: Battle::initialize()
> > (in /home/michael/ourrpg/main)
> > ==14210==    by 0x804AEE0: main (in /home/michael/ourrpg/main)
> > ==14210==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
> > ==14210== 
> > ==14210== ERROR SUMMARY: 5 errors from 4 contexts (suppressed: 37 from
> > 1)
> > ==14210== malloc/free: in use at exit: 75,377 bytes in 476 blocks.
> > ==14210== malloc/free: 4,930 allocs, 4,454 frees, 1,735,303 bytes
> > allocated.
> > ==14210== For counts of detected errors, rerun with: -v
> > ==14210== searching for pointers to 476 not-freed blocks.
> > ==14210== checked 898,684 bytes.
> > ==14210== 
> > ==14210== LEAK SUMMARY:
> > ==14210==    definitely lost: 10 bytes in 2 blocks.
> > ==14210==      possibly lost: 187 bytes in 8 blocks.
> > ==14210==    still reachable: 75,180 bytes in 466 blocks.
> > ==14210==         suppressed: 0 bytes in 0 blocks.
> > ==14210== Rerun with --leak-check=full to see details of leaked memory.
> > Segmentation fault
> >
> > I don't completely understand how to interpret valgrind's or gdb's
> > output, so if there is something useful there, please tell me...
> 
> You should build the program with debug symbols so that GDB and Valgrind 
> shows filename:linenumber information.
> _______________________________________________

Sorry, I thought the debugging info was already in there.  Here's the
new gdb output:

michael at camille ourrpg $ gdb main
GNU gdb 6.7.1
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show
copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) r
Starting program: /home/michael/ourrpg/main 
[Thread debugging using libthread_db enabled]
[New Thread 0x4000 (LWP 14482)]
Line is 65; i = 0

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x4000 (LWP 14482)]
0xb7e9a752 in SDL_MapRGB () from /usr/lib/libSDL-1.2.so.0
(gdb) backtrace 
#0  0xb7e9a752 in SDL_MapRGB () from /usr/lib/libSDL-1.2.so.0
#1  0x080498f9 in Battle::initialize (this=0xbfa23454) at battle.cpp:66
#2  0x0804aee1 in main () at main.cpp:7
(gdb) quit
The program is running.  Exit anyway? (y or n) y

And valgrind:

michael at camille ourrpg $ valgrind ./main
==14488== Memcheck, a memory error detector.
==14488== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et
al.
==14488== Using LibVEX rev 1732, a library for dynamic binary
translation.
==14488== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==14488== Using valgrind-3.2.3, a dynamic binary instrumentation
framework.
==14488== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et
al.
==14488== For more details, rerun with: -v
==14488== 
==14488== Syscall param write(buf) points to uninitialised byte(s)
==14488==    at 0x40DD69E: write (in /lib/libpthread-0.10.so)
==14488==    by 0x458DE7D: (within /usr/lib/libX11.so.6.2.0)
==14488==  Address 0x465897B is 19 bytes inside a block of size 16,384
alloc'd
==14488==    at 0x4021ABE: calloc
(in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==14488==    by 0x45731B3: XOpenDisplay (in /usr/lib/libX11.so.6.2.0)
==14488== 
==14488== Conditional jump or move depends on uninitialised value(s)
==14488==    at 0x80498A0: Battle::initialize() (battle.cpp:64)
==14488==    by 0x804AEE0: main (main.cpp:7)
Line is 65; i = 0
==14488== 
==14488== Use of uninitialised value of size 4
==14488==    at 0x80498D6: Battle::initialize() (battle.cpp:66)
==14488==    by 0x804AEE0: main (main.cpp:7)
==14488== 
==14488== Invalid read of size 4
==14488==    at 0x407F752: SDL_MapRGB (in /usr/lib/libSDL-1.2.so.0.11.0)
==14488==    by 0x80498F8: Battle::initialize() (battle.cpp:66)
==14488==    by 0x804AEE0: main (main.cpp:7)
==14488==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==14488== 
==14488== ERROR SUMMARY: 5 errors from 4 contexts (suppressed: 37 from
1)
==14488== malloc/free: in use at exit: 75,377 bytes in 476 blocks.
==14488== malloc/free: 4,931 allocs, 4,455 frees, 1,735,407 bytes
allocated.
==14488== For counts of detected errors, rerun with: -v
==14488== searching for pointers to 476 not-freed blocks.
==14488== checked 898,684 bytes.
==14488== 
==14488== LEAK SUMMARY:
==14488==    definitely lost: 10 bytes in 2 blocks.
==14488==      possibly lost: 187 bytes in 8 blocks.
==14488==    still reachable: 75,180 bytes in 466 blocks.
==14488==         suppressed: 0 bytes in 0 blocks.
==14488== Rerun with --leak-check=full to see details of leaked memory.
Segmentation fault




More information about the SDL mailing list