<div dir="ltr"><div>Всем привет!</div><div><br></div><div>Есть необходимость подключиться к работающему перловому скрипту для отладки.<br>Мне удается подключиться к процессу с помощью gdb+<a href="https://metacpan.org/pod/release/JJORE/Enbugger-2.013/lib/Enbugger.pod">Enbugger</a>, но при попытке поставить breakpoint на строку или вызов метода в модуле, отладчик всегда пишет, что не может её найти.</div>
<div>С каноническим примером perl -E ' while(1) {...}' получается, а если соорудить минимальный скриптец с AE -- ни в какую.</div><div><br></div><div>Тестовый скрипт:</div><div><br></div><div><div><b><a href="http://debug_test.pl">debug_test.pl</a>:</b><br>
</div><div><i>#!/usr/bin/env perl</i></div><div><i><br></i></div><div><i>use strict;</i><br></div><div><i>use warnings;</i></div><div><i><br></i></div><div><i>use AnyEvent;</i></div><div><i>use lib 'lib';<br></i></div>
<div><i>use DebugTest;</i></div><div><i><br></i></div><div><i>my $cv = AE::cv;</i></div><div><i>DebugTest->run();<br></i></div><div><i>$cv->recv();</i><br></div></div><div><br></div><div><br></div><div><div><b>lib/DebugTest.pm:</b></div>
<div><i>package DebugTest;</i></div><div><i><br></i></div><div><i>use v5.10;</i></div><div><i>use strict;</i></div><div><i>use warnings;</i></div><div><i><br></i></div><div><i>my $timer_w;</i></div><div><i>my $signal_w;</i></div>
<div><i><br></i></div><div><i>our $i;</i></div><div><i><br></i></div><div><i>sub run {</i></div><div><i>  $timer_w  = AE::timer 1, 1, sub { _say( ++$i ) };</i></div><div><i>  $signal_w = AE::signal USR1 => sub { _say( 'USR1 received' ) };</i></div>
<div><i>}</i></div><div><i><br></i></div><div><i>sub _say {</i></div><div><i> say @_;    # <<<<<<< вот сюда бы breakpoint поставить</i></div><div><i>}</i></div><div><i><br></i></div><div><i>1;</i></div>
</div><div><br></div><div>Если запускать обычным способом perl -d <a href="http://debug_test.pl">debug_test.pl</a>, breakpoint без проблем устанавливается и срабатывает.<br></div><div>Если цепляться через gdb+Enbugger, не получается:</div>
<div><div><i>Enter h or `h h' for help, or `man perldebug' for more help.</i></div><div><i><br></i></div><div><i>AnyEvent::Impl::EV::((eval 23)[/home/scripter/perl5/perlbrew/perls/perl-5.14.4/lib/site_perl/5.14.4/x86_64-linux/AnyEvent/Impl/EV.pm:88]:1):</i></div>
<div><i>1:<span class="" style="white-space:pre"> </span>eval{require Enbugger;warn q(stopping);$ENV{PERLDB_OPTS}='RemotePort=localhost:4000';Enbugger->stop;};print STDERR $@</i></div><div><i>  DB<1> </i></div>
<div><i>  DB<2> l</i></div><div><i>1==><span class="" style="white-space:pre">  </span>eval{require Enbugger;warn q(stopping);$ENV{PERLDB_OPTS}='RemotePort=localhost:4000';Enbugger->stop;};print STDERR $@</i></div>
<div><i>2 <span class="" style="white-space:pre"> </span>;</i></div><div><i>  DB<2> T</i></div><div><i>$ = eval 'eval{require Enbugger;warn q(stopping);$ENV{PERLDB_OPTS}=\'RemotePort=localhost:4000\';Enbugger->stop;};print STDERR $@' called from file `/home/scripter/perl5/perlbrew/perls/perl-5.14.4/lib/site_perl/5.14.4/x86_64-linux/AnyEvent/Impl/EV.pm' line 88</i></div>
<div><i>. = AnyEvent::CondVar::Base::_wait(ref(AnyEvent::CondVar)) called from file `/home/scripter/perl5/perlbrew/perls/perl-5.14.4/lib/site_perl/5.14.4/x86_64-linux/AnyEvent.pm' line 1981</i></div><div><i>. = AnyEvent::CondVar::Base::recv(ref(AnyEvent::CondVar)) called from file `<a href="http://debug_test.pl">debug_test.pl</a>' line 16</i></div>
<div><i>  DB<2> p $DebugTest::i   </i></div><div><i>6</i></div><div><i>  DB<3> b DebugTest::_say</i></div><div><i>Subroutine DebugTest::_say not found.</i></div><div><i>  DB<4> </i></div></div><div><br></div>
<div>Может кто знает как это побороть? <br></div><div><br></div>-- <br><div dir="ltr"><div>  С уважением,<br></div><div>  Вадим Власов</div><div>  т.: +7 (916) 424-00-72</div></div>
</div>