> (Sorry about the repost, hotmail does unconscionable things with
> whitespace)
> 
> 
> 
> Greetings! I appear to have a challenging detective task at hand.
> Interested parties can try out the gdb/perl -d trick to help me out.
> 
> 
> My Text::Scan module has, after working flawlessly for over a month,
> manifested a segmentation fault that appears to come out of nowhere.
> It happens during a newSVpv operation to create one of the return
> values out of a C string.
> 
> 
> The baffling thing about it is that the string it is copying is simply
> the same string it copied several times before, it being in the same
> memory location. What the module does is locate all the occurrences in
> a text (perl string) of any of the keys that have been entered. Thus
> it will return either a hash of unique keys found or a list of every
> one found (possibly including duplicates).
> 
> 
> The data structure is based on Bentley + Sedgewick's ternary tree
> code. As the keys are found in the text, an array of pointers to them
> is incremented, after which all the pointers are used to provide
> return values via the stack, after creation of a perl scalar for each
> of them. Thus many keys are often converted more than once, as the
> pointers may point to the same memory location. (I know what you're
> thinking. Not so fast! free() is not called anytime before the
> function exits!)
> 
> 
> I've spent a full day on this. With the hope of getting you
> interested, I've made a special debugging version of Text::Scan
> available on CPAN at
> http://www.cpan.org/modules/by-module/Text/IWOODHEAD/Text-Scan-0.04deb
> ug.tar.gz
> 
> 
> After running make test you can observe the last test in
> t/57_breakme.t segfault, and if you're into it you can try the
> debugging trick of using gdb to run perl, like this: (first cp
> _Inline/build/Text/Scan/Scan.xs .)
> 
> 
> gdb perl
> (no debugging symbols found)...
> (gdb) run -Iblib/arch -Iblib/lib -I/usr/lib/perl5/5.6.0/i386-linux
> -I/usr/lib/perl5/5.6.0 -d t/57_breakme.t
> 
> 
> Starting program: /usr/local/bin/perl -Iblib/arch -Iblib/lib
> -I/usr/lib/perl5/5.6.0/i386-linux -I/usr/lib/perl5/5.6.0 -d
> t/57_breakme.t
> Default die handler restored.
>  
> 
> Loading DB routines from perl5db.pl version 1.07
> Editor support available.
> 
>  
> Enter h or `h h' for help, or `man perldebug' for more help.
>  
> 
> 1..1
> Inline::CODE(0x83bc59c)((eval
> 2)[/usr/lib/perl5/site_perl/5.6.0/Inline.pm:180]:4):
> 4:          $INIT++;
>   DB<1> n
> Inline::CODE(0x83bc59c)((eval
> 2)[/usr/lib/perl5/site_perl/5.6.0/Inline.pm:180]:5):
> 5:          &init;
>   DB<1> n
> main::(t/57_breakme.t:9):       $ref = new Text::Scan;
>   DB<1> (CTRL-C)
>  
> 
> Program received signal SIGINT, Interrupt.
> 0x40091801 in __kill () from /lib/i686/libc.so.6
> (gdb) break scan
> Breakpoint 1 at 0x40201a17: file Scan.xs, line 309.
> (gdb) c
> Continuing.
>   DB<1> c
> c
>  
> 
> Breakpoint 1, scan (obj=0x83a6e84,
>     s=0x854cd18 "doc      fbis3 20900         jpest005___94017
> jprs est
> 94 005   document type jprs   document title science  amp  technology
> europe international economic competitiveness      3 march 19"...) at
> Scan.xs:309
> warning: Source file is more recent than executable.
>  
> 
> 309             Tobj* pTernary = (Tobj*)SvIV(SvRV(obj));
> (gdb)
> 
> 
> 
> 
> ...you get the idea. It's fun!
> 
> 
> Additionally here is a stack backtrace:
> (gdb) backtrace
> #0  chunk_alloc (ar_ptr=0x4018cf00, nb=1016) at malloc.c:2979
> #1  0x400e313a in __libc_malloc (bytes=1008) at malloc.c:2714
> #2  0x0808c408 in Perl_safemalloc () at eval.c:41
> #3  0x0809e95d in Perl_sv_add_arena () at eval.c:41
> #4  0x080a5685 in Perl_newSVpv () at eval.c:41
> #5  0x40201ac6 in scan (obj=0x83a6e84,
>     s=0x854e498 "doc      fbis3 20900         jpest005___94017
> jprs est
> 94 005   document type jprs   document title science  amp  technology
> europe international economic competitiveness      3 march 19"...) at
> Scan.xs:319
> #6  0x4020224d in XS_Text__Scan_scan (cv=0x854266c) at Scan.xs:395
> #7  0x0809dd2c in Perl_pp_entersub () at eval.c:41
> #8  0x08098658 in Perl_runops_standard () at eval.c:41
> #9  0x0805bfba in perl_run () at eval.c:41
> #10 0x0805bd2b in perl_run () at eval.c:41
> #11 0x08059a21 in main () at eval.c:41
> #12 0x40080177 in __libc_start_main (main=0x80599b0 <main>, argc=7,
>     ubp_av=0xbffff98c, init=0x8058b80 <_init>, fini=0x80df83c <_fini>,
>     rtld_fini=0x4000e184 <_dl_fini>, stack_end=0xbffff97c)
>     at ../sysdeps/generic/libc-start.c:129
> 
> 
> 
> ...showing that the segfault occurs during Perl_safemalloc. Wow!
> ...Any clues appreciated! 
> 
> 
> Regards,
> 
> 

Reply via email to