LINUX.ORG.RU

сегфолт в perl gtk2, которого раньше не было

 , ,


0

2

начал тут сегфолтится один мой скриптик с ГУИ. так как С за 15 лет я уже забыл, но смутно помню perl, это perl5.16 + GTK2.

судя по всему, это из-за перехода на threaded perl.

вот, вырезал отдельно ту часть, где сегфолт. если закоментарить назначение хэндлера на SIGCHLD, то все работает:

#$SIG{CHLD} = sub {
#    print "SIGCHLD\n";
#};

вот сам скрипт (нужен x11-toolkits/p5-Gtk2, или как там оно у вас):

#!/usr/bin/perl

use Gtk2 '-init';

# GTK stuff

my $window = Gtk2::Window->new;
$window->set_title("TEST");

my $button = Gtk2::Button->new();
$button->signal_connect("clicked" => \&callback);

my $label =  Gtk2::Label->new("Button");
$button->add($label);

$window->add($button);
$window->show_all;

# Handle SIGCHLD

$SIG{CHLD} = sub {
    print "SIGCHLD\n";
};

# Start the app

Gtk2->main;
0;

# When the button is clicked

sub callback {
    print "Forking... ";
    my $pid = fork(); 
    die "cannot fork" unless defined $pid;
    if ($pid == 0) { 
            print "child\n";
            exit 0;
    }
    print "parent\n";
}

как видно, хэндлер даже не выполняется. просто сразу сегфолт:

Forking... parent
child
Segmentation fault

что тут блин надо?

★★★★

С виду всё прилично. У меня в Debian работает и не падает: perl 5.18.2 threaded, $Gtk2::VERSION = 1.248. Может perl собран с небезопасными сигналами?

Olegymous ★★★
()
Ответ на: комментарий от Olegymous

эх, блин, и у меня оно раньше работало...

вот опции:

ross@desktop /home/ross pts/2> pkg version -x perl
perl5-5.16.3_6
ross@desktop /home/ross pts/2> cd /usr/ports/lang/perl5.16
ross@desktop /usr/ports/lang/perl5.16 pts/2> make showconfig
===> The following configuration options are available for perl5-5.16.3_6:
     DEBUG=off: Install debug symbols
     GDBM=off: GDBM_File extension
     MULTIPLICITY=off: Use multiplicity
     PERL_64BITINT=on: Use 64 bit integers (on i386)
     PERL_MALLOC=off: Use Perl malloc
     PTHREAD=on: Build with -pthread
     SITECUSTOMIZE=off: Run-time customization of @INC
     THREADS=on: Build threaded perl
     USE_PERL=on: Rewrite links in /usr/bin
===> Use 'make config' to modify these settings

вроде только ОС 9.2 → 10 изменилось. ну и еще шлангом все собрано теперь... а сегфолтится.

moot ★★★★
() автор топика
Ответ на: комментарий от Olegymous
ross@desktop /home/ross pts/2> perl -V
Summary of my perl5 (revision 5 version 16 subversion 3) configuration:
   
  Platform:
    osname=freebsd, osvers=10.0-rc1, archname=amd64-freebsd-thread-multi
    uname='freebsd 10amd64-default-job-12 10.0-rc1 freebsd 10.0-rc1 amd64 '
    config_args='-sde -Dprefix=/usr/local -Darchlib=/usr/local/lib/perl5/5.16/mach -Dprivlib=/usr/local/lib/perl5/5.16 -Dman3dir=/usr/local/lib/perl5/5.16/perl/man/man3 -Dman1dir=/usr/local/man/man1 -Dsitearch=/usr/local/lib/perl5/site_perl/5.16/mach -Dsitelib=/usr/local/lib/perl5/site_perl/5.16 -Dscriptdir=/usr/local/bin -Dsiteman3dir=/usr/local/lib/perl5/5.16/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Ui_malloc -Ui_iconv -Uinstallusrbinperl -Dcc=cc -Duseshrplib -Dinc_version_list=none -Dccflags=-DAPPLLIB_EXP="/usr/local/lib/perl5/5.16/BSDPAN" -Doptimize=-O2 -pipe -fno-strict-aliasing -Ui_gdbm -Dusethreads=y -Dusemymalloc=n -Duse64bitint'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-DAPPLLIB_EXP="/usr/local/lib/perl5/5.16/BSDPAN" -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include',
    optimize='-O2 -pipe -fno-strict-aliasing',
    cppflags='-DAPPLLIB_EXP="/usr/local/lib/perl5/5.16/BSDPAN" -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.2.1 Compatible FreeBSD Clang 3.3 (tags/RELEASE_33/final 183502)', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='cc', ldflags ='-pthread -Wl,-E  -fstack-protector -L/usr/local/lib'
    libpth=/usr/lib /usr/local/lib
    libs=-lm -lcrypt -lutil
    perllibs=-lm -lcrypt -lutil
    libc=, so=so, useshrplib=true, libperl=libperl.so
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='  -Wl,-R/usr/local/lib/perl5/5.16/mach/CORE'
    cccdlflags='-DPIC -fPIC', lddlflags='-shared  -L/usr/local/lib -fstack-protector'


Characteristics of this binary (from libperl): 
  Compile-time options: HAS_TIMES MULTIPLICITY PERLIO_LAYERS
                        PERL_DONT_CREATE_GVSV PERL_IMPLICIT_CONTEXT
                        PERL_MALLOC_WRAP PERL_PRESERVE_IVUV USE_64_BIT_ALL
                        USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES
                        USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE
                        USE_LOCALE_NUMERIC USE_PERLIO USE_PERL_ATOF
                        USE_REENTRANT_API
  Built under freebsd
  Compiled at Jan  2 2014 10:48:12
  @INC:
    /usr/local/lib/perl5/5.16/BSDPAN
    /usr/local/lib/perl5/site_perl/5.16/mach
    /usr/local/lib/perl5/site_perl/5.16
    /usr/local/lib/perl5/5.16/mach
    /usr/local/lib/perl5/5.16
moot ★★★★
() автор топика

как оказалось, это была кривая настройка гтк под кедами. убил ~/.gtk*, перенастроил gtk под qtcurve и сегфолт пропал.

такие дела (мож кому пригодится в поиске)

moot ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.