Re: Memory access problem with DBI or DBD-Mysql?
Patrick Galbraith <[email protected]>
| Newsgroups | gmane.comp.db.mysql.perl,gmane.comp.lang.perl.modules.dbi.general |
|---|---|
| Message-ID | <[email protected]> |
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. >>>>> >> >> >> > -- MySQL Perl Mailing List For list archives: http://lists.mysql.com/perl To unsubscribe: http://lists.mysql.com/[email protected]