Bug 29439 - Не определена переменная окружения PERL5DB_THREADED
Summary: Не определена переменная окружения PERL5DB_THREADED
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: perl-devel (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: at@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-10-08 16:33 MSK by Владимир Диденко
Modified: 2013-10-09 12:56 MSK (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Владимир Диденко 2013-10-08 16:33:16 MSK
В текущей версии 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 Vladimir Lettiev 2013-10-08 17:41:44 MSK
Фишка в том, что нужно самому устанавливать переменную 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 Владимир Диденко 2013-10-08 17:54:18 MSK
Понятно, спасибо за разъяснения. Извиняюсь за ложную тревогу.
Comment 3 Владимир Диденко 2013-10-08 19:27:25 MSK
Хм, но похоже с 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 Vladimir Lettiev 2013-10-09 00:42:47 MSK
(В ответ на комментарий №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 Владимир Диденко 2013-10-09 12:56:14 MSK
(В ответ на комментарий №4)
> Т.е. похоже никогда не работало.

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