Bug 29439 - Не определена переменная окружения PERL5DB_THREADED
: Не определена переменная окружения PERL5DB_THREADED
Status: CLOSED NOTABUG
: Sisyphus
(All bugs in Sisyphus/perl-devel)
: unstable
: all Linux
: P3 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2013-10-08 16:33 by
Modified: 2013-10-09 12:56 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2013-10-08 16:33:16
В текущей версии 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 не расшаривается.
------- Comment #1 From 2013-10-08 17:41:44 -------
Фишка в том, что нужно самому устанавливать переменную 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
ставились пустые заглушки. Это значит, что при отладке приложения с тредами эти
функции ничего не делали, что неправильно и было чревато ошибками.
------- Comment #2 From 2013-10-08 17:54:18 -------
Понятно, спасибо за разъяснения. Извиняюсь за ложную тревогу.
------- Comment #3 From 2013-10-08 19:27:25 -------
Хм, но похоже с 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');

Это я опять что-то не так делаю?
------- Comment #4 From 2013-10-09 00:42:47 -------
(В ответ на комментарий №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). Т.е. похоже никогда не работало.
------- Comment #5 From 2013-10-09 12:56:14 -------
(В ответ на комментарий №4)
> Т.е. похоже никогда не работало.

Тогда непонятно, что делать в этой ситуации - идти жаловаться в апстрим? Ведь
теоретически это же должно работать, PERL5DB_THREADED не для красоты же сделан 
- например, в откопанной книжке "Pro Perl Debugging" у автора вроде бы все
работало, он говорил о версиях >= 5.8.5.