List:MySQL and Perl« Previous MessageNext Message »
From:Patrick Galbraith Date:September 13 2006 4:49pm
Subject:Re: Memory access problem with DBI or DBD-Mysql?
View as plain text  
Sam Smith wrote:

Sam,

Thanks for the trace. I need to talk to someone about getting an OpenBSD 
box to test out potential solutions.

Regards,

Patrick

> On Mon, 11 Sep 2006, Federico Giannici wrote:
>
>> I have seen that version 3.0007 has been released and it (should) 
>> have fixed that bug.
>
>
> I'm still seeing segfaults with 3.0007
>
> gdb /usr/bin/perl
> GNU gdb 6.3
> Copyright 2004 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-unknown-openbsd4.0"...(no debugging 
> symbols found)
>
> (gdb) target core perl.core
> Core was generated by `perl'.
> Program terminated with signal 11, Segmentation fault.
> Reading symbols from /usr/lib/libperl.so.10.1...
> done.
> Loaded symbols for /usr/lib/libperl.so.10.1
> Reading symbols from /usr/lib/libm.so.2.3...done.
> Loaded symbols for /usr/lib/libm.so.2.3
> Reading symbols from /usr/lib/libutil.so.11.0...done.
> Loaded symbols for /usr/lib/libutil.so.11.0
> Reading symbols from /usr/lib/libc.so.39.2...done.
> Loaded symbols for /usr/lib/libc.so.39.2
> Reading symbols from /usr/libexec/ld.so...done.
> Loaded symbols for /usr/libexec/ld.so
> Reading symbols from 
> /usr/local/libdata/perl5/site_perl/i386-openbsd/auto/DBI/DBI.so...done.
> Loaded symbols for 
> /usr/local/libdata/perl5/site_perl/i386-openbsd/auto/DBI/DBI.so
> Reading symbols from 
> /usr/libdata/perl5/i386-openbsd/5.8.8/auto/List/Util/Util.so...done.
> Loaded symbols for 
> /usr/libdata/perl5/i386-openbsd/5.8.8/auto/List/Util/Util.so
> Reading symbols from 
> /usr/local/libdata/perl5/site_perl/i386-openbsd/auto/HTML/Parser/Parser.so...done. 
>
> Loaded symbols for 
> /usr/local/libdata/perl5/site_perl/i386-openbsd/auto/HTML/Parser/Parser.so 
>
> Reading symbols from 
> /usr/local/libdata/perl5/site_perl/i386-openbsd/auto/DBD/mysql/mysql.so...done. 
>
> Loaded symbols for 
> /usr/local/libdata/perl5/site_perl/i386-openbsd/auto/DBD/mysql/mysql.so
> Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16.0...done.
> Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16.0
> Reading symbols from /usr/lib/libz.so.4.1...done.
> Loaded symbols for /usr/lib/libz.so.4.1
> Reading symbols from /usr/lib/libssl.so.11.0...done.
> Loaded symbols for /usr/lib/libssl.so.11.0
> Reading symbols from /usr/lib/libcrypto.so.13.0...done.
> Loaded symbols for /usr/lib/libcrypto.so.13.0
> Reading symbols from 
> /usr/libdata/perl5/i386-openbsd/5.8.8/auto/IO/IO.so...done.
> Loaded symbols for /usr/libdata/perl5/i386-openbsd/5.8.8/auto/IO/IO.so
> Reading symbols from 
> /usr/libdata/perl5/i386-openbsd/5.8.8/auto/Socket/Socket.so...done.
> Loaded symbols for 
> /usr/libdata/perl5/i386-openbsd/5.8.8/auto/Socket/Socket.so
> Reading symbols from 
> /usr/local/libdata/perl5/site_perl/i386-openbsd/auto/Compress/Zlib/Zlib.so...done. 
>
> Loaded symbols for 
> /usr/local/libdata/perl5/site_perl/i386-openbsd/auto/Compress/Zlib/Zlib.so 
>
> #0  mysql_st_internal_execute (h=0x80b8463c, statement=0x8109f4d4, 
> attribs=0x0, num_params=0, params=0x0, result=0xcf7ddf18,
>     svsock=0x7f9b8854, use_mysql_use_result=0) at dbdimp.c:2383
> 2383      salloc= parse_params(svsock,
> (gdb) bt
> #0  mysql_st_internal_execute (h=0x80b8463c, statement=0x8109f4d4, 
> attribs=0x0, num_params=0, params=0x0, result=0xcf7ddf18,
>     svsock=0x7f9b8854, use_mysql_use_result=0) at dbdimp.c:2383
> #1  0x0047de9c in XS_DBD__mysql__db_do (cv=0x80b84078) at mysql.xs:458
> #2  0x0d2b5465 in XS_DBI_dispatch () from 
> /usr/local/libdata/perl5/site_perl/i386-openbsd/auto/DBI/DBI.so
> #3  0x0cdd2d08 in Perl_pp_entersub () at 
> /usr/src/gnu/usr.bin/perl/pp_hot.c:2877
> #4  0x0cdfd5b9 in Perl_runops_standard () at 
> /usr/src/gnu/usr.bin/perl/run.c:37
> #5  0x0cde35df in S_run_body (oldscope=1) at 
> /usr/src/gnu/usr.bin/perl/perl.c:2368
> #6  0x0cde3533 in perl_run (my_perl=0x7f47c030) at 
> /usr/src/gnu/usr.bin/perl/perl.c:2285
> #7  0x1c0012a6 in main ()
> (gdb) [sams@sebastian ~/work/democracy.org.uk/politicalhome]perl -V
> Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
>   Platform:
>     osname=openbsd, osvers=4.0, archname=i386-openbsd
>     uname='openbsd'
>     config_args='-dsE -Dopenbsd_distribution=defined'
>     hint=recommended, useposix=true, d_sigaction=define
>     usethreads=undef use5005threads=undef useithreads=undef 
> usemultiplicity=undef
>     useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
>     use64bitint=undef use64bitall=undef uselongdouble=undef
>     usemymalloc=n, bincompat5005=undef
>   Compiler:
>     cc='cc', ccflags ='-fno-strict-aliasing 
> -fno-delete-null-pointer-checks -pipe -I/usr/local/include',
>     optimize='-O2',
>     cppflags='-fno-strict-aliasing -fno-delete-null-pointer-checks 
> -pipe -I/usr/local/include'
>     ccversion='', gccversion='3.3.5 (propolice)', 
> gccosandvers='openbsd4.0'
>     intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
>     d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
>     ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', 
> lseeksize=8
>     alignbytes=4, prototype=define
>   Linker and Libraries:
>     ld='cc', ldflags ='-Wl,-E '
>     libpth=/usr/lib
>     libs=-lm -lutil -lc
>     perllibs=-lm -lutil -lc
>     libc=/usr/lib/libc.a, so=so, useshrplib=true, libperl=libperl.so.10.1
>     gnulibc_version=''
>   Dynamic Linking:
>     dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, 
> ccdlflags='-Wl,-R/usr/libdata/perl5/i386-openbsd/5.8.8/CORE'
>     cccdlflags='-DPIC -fPIC ', lddlflags='-shared -fPIC '
>
>
> Characteristics of this binary (from libperl):
>   Compile-time options: PERL_MALLOC_WRAP USE_LARGE_FILES USE_PERLIO
>   Built under openbsd
>   @INC:
>     /usr/libdata/perl5/i386-openbsd/5.8.8
>     /usr/local/libdata/perl5/i386-openbsd/5.8.8
>     /usr/libdata/perl5
>     /usr/local/libdata/perl5
>     /usr/local/libdata/perl5/site_perl/i386-openbsd
>     /usr/libdata/perl5/site_perl/i386-openbsd
>     /usr/local/libdata/perl5/site_perl
>     /usr/libdata/perl5/site_perl
>     /usr/local/lib/perl5/site_perl
>     .
>
>
>
>
>
> Regards
> Sam
>
>> But...
>>
>> 1) In mysql_st_internal_execute() the "bind_type_guessing" variable 
>> is correctly set, but then it's NOT used: 
>> "imp_dbh->bind_type_guessing" is still used!
>>
>> 2) mysql_st_internal_execute() is used in only two places. Instead of 
>> doing all that tests at the beginning of the function to handle both 
>> cases (STH and DBH for the "h" parameter), why don't you change the 
>> type of the first parameter into a "imp_dbh"? Wouldn't everything be 
>> clearer this way?
>>
>>
>> Bye.
>>
>>
>>
>> Federico Giannici wrote:
>>
>>> Hi Patrick,
>>> are there any news about this bug?
>>>
>>> Someone made me notice that there a few other "tickets" open on this 
>>> bug (under i386 and amd64), like this one:
>>>
>>> http://rt.cpan.org/Public/Bug/Display.html?id=20868
>>>
>>> Thanks.
>>>
>>>
>>>
>>> Patrick Galbraith wrote:
>>>
>>>> Federico,
>>>>
>>>> That may be the issue. I have encountered this issue in other parts 
>>>> of the driver. There is a better way to do this, and I can look at 
>>>> making sure what is being passed is the same data object.
>>>>
>>>> Thanks!
>>>>
>>>> Patrick
>>>>
>>>> Federico Giannici wrote:
>>>>
>>>>> Since there has been no reply to my previous message, I have done 
>>>>> further investigations trying to find the problem.
>>>>>
>>>>> Please note that my knowledge of DBI/DBD is almost null, so the 
>>>>> followings are only simple suppositions.
>>>>>
>>>>> I have seen that mysql_st_internal_execute() function is executed 
>>>>> by both the "do" and "execute" methods. It seems that the problems 
>>>>> are only with the "do" method and not with the "execute", so I 
>>>>> looked for the differences between them.
>>>>>
>>>>> The main difference seems to be that "execute" passes a STATEMENT 
>>>>> handle as first argument, while "do" passes a DATABASE handle. The 
>>>>> mysql_st_internal_execute() function uses this handle to obtain 
>>>>> the sth and then from this one the dbh.
>>>>>
>>>>> So, my hypothesis is that if the initial handle is a database one, 
>>>>> the sth (and the derived dbh) obtained from this is not a valid one!
>>>>>
>>>>> Anybody can confirm (or negate) this wild hypothesis?
>>>>>
>>>>> Thanks.
>>>>>
>>>>> P.S.
>>>>> I want to repeat that the problem manifest itself only under 
>>>>> OpenBSD because of it's memory management that cause the program 
>>>>> to segfault if try to access a non allocated memory. In other 
>>>>> operating systems, a random value is get for 
>>>>> "imp_dbh->bind_type_guessing", which is almost irrelevant.
>>>>>
>>>>>
>>>>> Federico Giannici wrote:
>>>>>
>>>>>> It seems to me that there is some kind of memory access problem 
>>>>>> with DBI or DBD-Mysql.
>>>>>>
>>>>>> I'm using OpenBSD 3.9-stable amd64. On OpenBSD 3.3 i386 the 
>>>>>> problem didn't appeared. As you may know, recent version of 
>>>>>> OpenBSD have a new kind of memory handling that make the programs
> 
>>>>>> segfault when they try to access no (longer) allocated memory.
>>>>>>
>>>>>> I'm using DBI 1.45 and DBD-Mysql 2.9008. I tried DBI 1.52 and 
>>>>>> DBD-Mysql 3.0006, but the problems were more frequent, so I 
>>>>>> remained to the old versions.
>>>>>>
>>>>>> Here is the problem: frequently some "do" commands cause perl to
> 
>>>>>> crash with signal 11. The crashes seems to depend on a lot of 
>>>>>> factors. For example, loading more libraries could make the 
>>>>>> program to start working. I think it depends on the structure of
> 
>>>>>> the memory allocated to the program.
>>>>>>
>>>>>> Here is the "bt" output of the core dump:
>>>>>>
>>>>>> #0  0x000000005260a736 in mysql_st_internal_execute 
>>>>>> (h=0x4713b6e0, statement=0x479b7140, attribs=0x4aa5fd40, 
>>>>>> numParams=0, params=0x0,
>>>>>>     cdaPtr=0x7f7ffffc8610, svsock=0x43c90498, 
>>>>>> use_mysql_use_result=0) at dbdimp.c:1654
>>>>>> #1  0x0000000052612da3 in XS_DBD__mysql__db_do (cv=0x40970b20) at
> 
>>>>>> mysql.xs:222
>>>>>> #2  0x0000000050ddf07b in XS_DBI_dispatch () from 
>>>>>> /usr/local/libdata/perl5/site_perl/amd64-openbsd/auto/DBI/DBI.so
>>>>>> #3  0x000000004a5a1c47 in Perl_pp_entersub () at 
>>>>>> /usr/src/gnu/usr.bin/perl/pp_hot.c:2890
>>>>>> #4  0x000000004a60899e in Perl_runops_standard () at 
>>>>>> /usr/src/gnu/usr.bin/perl/run.c:37
>>>>>> #5  0x000000004a5f744d in S_run_body (oldscope=1) at 
>>>>>> /usr/src/gnu/usr.bin/perl/perl.c:1936
>>>>>> #6  0x000000004a5f7231 in perl_run (my_perl=0x45356258) at 
>>>>>> /usr/src/gnu/usr.bin/perl/perl.c:1855
>>>>>> #7  0x0000000000401afe in main ()
>>>>>>
>>>>>> I have found the problem is caused by accessing 
>>>>>> "imp_dbh->bind_type_guessing" for the call to ParseParam()
> inside 
>>>>>> mysql_st_internal_execute().
>>>>>>
>>>>>> I have verified that "imp_dbh" is NOT null, but trying to access
> 
>>>>>> any member make the program segfault. So maybe the pointer is a 
>>>>>> stale one?
>>>>>>
>>>>>> I have not enough knowledge of DBI to make more debugging.
>>>>>>
>>>>>>
>>>>>> Bye.
>>>>>
>>
>>
>>
>

Thread
Re: Memory access problem with DBI or DBD-Mysql?Federico Giannici15 Aug
  • Re: Memory access problem with DBI or DBD-Mysql?Patrick Galbraith4 Sep
    • Re: Memory access problem with DBI or DBD-Mysql?Federico Giannici9 Sep
      • Re: Memory access problem with DBI or DBD-Mysql?Federico Giannici11 Sep
        • Re: Memory access problem with DBI or DBD-Mysql?Sam Smith11 Sep
          • Re: Memory access problem with DBI or DBD-Mysql?Patrick Galbraith13 Sep
            • Re: Memory access problem with DBI or DBD-Mysql?Federico Giannici13 Sep
              • Re: Memory access problem with DBI or DBD-Mysql?Patrick Galbraith14 Sep
        • Re: Memory access problem with DBI or DBD-Mysql?Patrick Galbraith13 Sep
          • Re: Memory access problem with DBI or DBD-Mysql?Federico Giannici13 Sep