В текущей версии perl-devel сизифа есть проблема с отладкой многопоточных приложений. При отладке следующего куска кода #!/usr/bin/perl use threads; use threads::shared; появляется следующее сообщение об ошибке $ perl -d ./test.pl Loading DB routines from perl5db.pl version 1.39_10 Editor support available. Enter h or 'h h' for help, or 'man perldebug' for more help. lock can only be used on shared values at /usr/share/perl5/perl5db.pl line 4100. BEGIN failed--compilation aborted at ./test.pl line 4. lock can only be used on shared values at /usr/share/perl5/perl5db.pl line 2510. END failed--call queue aborted at ./test.pl line 4. Unbalanced scopes: 3 more ENTERs than LEAVEs В ходе разбирательств нашел, что не правильно отрабатывает следующий кусок кода в /usr/share/perl5/perl5db.pl BEGIN { # ensure we can share our non-threaded variables or no-op if ($ENV{PERL5DB_THREADED}) { require threads; require threads::shared; import threads::shared qw(share); $DBGR; share(\$DBGR); lock($DBGR); print "Threads support enabled\n"; } else { *share = sub(\[$@%]) {}; } } Переменная окружения PERL5DB_THREADED оказывается не определенной, вследствие чего переменная $DBGR не расшаривается.
Фишка в том, что нужно самому устанавливать переменную PERL5DB_THREADED, если происходит отладка приложения использующего треды. Об этом явно написано в документации http://perldoc.perl.org/perlrun.html#ENVIRONMENT В Perl 5.18 код дебаггера был очень здорово переработан. После этого изменения http://perl5.git.perl.org/perl.git/commitdiff/cde405a6b9b86bd8110f63531b42d89590a4c56e запуск отладки приложения, использующего threads::shared без установленной переменной окружения PERL5DB_THREADED перестал работать. Там видно, что раньше, если переменная окружения не была определена, то вместо функций lock и share ставились пустые заглушки. Это значит, что при отладке приложения с тредами эти функции ничего не делали, что неправильно и было чревато ошибками.
Понятно, спасибо за разъяснения. Извиняюсь за ложную тревогу.
Хм, но похоже с PERL5DB_THREADED тоже не работает. На следующем тестовом примере #!/usr/bin/perl use threads; sub start_thread { my @args = @_; print('Thread started: ', join(' ', @args), "\n"); exit 0; } my $thr = threads->create('start_thread', 'argument'); $thr->join(); отладчик зависает на строчке my $thr = threads->create('start_thread', 'argument'); Это я опять что-то не так делаю?
(В ответ на комментарий №3) > Хм, но похоже с PERL5DB_THREADED тоже не работает. На следующем тестовом > примере ... > отладчик зависает на строчке > my $thr = threads->create('start_thread', 'argument'); > > Это я опять что-то не так делаю? Тестовый пример можно упростить до $ PERLDB_OPTS="noTTY" perl -Mthreads -dt -e "threads->create(sub{})->join" (опция -dt как раз устанавливает переменную PERL5DB_THREADED) Виснет намертво (похоже на дедлок), убивается только через KILL. Я посмотрел, это не работает ни на одном perl (с perl 5.8.8 и perl5db.pl версии 1.28). Т.е. похоже никогда не работало.
(В ответ на комментарий №4) > Т.е. похоже никогда не работало. Тогда непонятно, что делать в этой ситуации - идти жаловаться в апстрим? Ведь теоретически это же должно работать, PERL5DB_THREADED не для красоты же сделан - например, в откопанной книжке "Pro Perl Debugging" у автора вроде бы все работало, он говорил о версиях >= 5.8.5.