[Moscow.pm] Enbugger + gdb + AE

Вадим Власов scripter.vrn на gmail.com
Пт Дек 6 00:38:46 PST 2013


А чем он в моем слуае поможет? Я к процессу прицепиться-то могу и
глобальные переменные посмотреть и методы подергать. Тут речь больше не об
отладке в процессе разработки, а о возможности посмотреть уже работающий
код, который при редком непонятном стечении обстоятельств начинает себя
как-нибудь странно вести. Пример просто демонстрирует проблему.


6 декабря 2013 г., 11:56 пользователь Dmitry Simonov
<dsimonov на gmail.com>написал:

> Вадим! У AE есть свой собственный дебаггер AnyEvent::Debug.
>
> ---
> Dmitriy V. Simonov,
> Perl & Python programmer
>
>
> 2013/12/6 Вадим Власов <scripter.vrn на gmail.com>
>
>> Всем привет!
>>
>> Есть необходимость подключиться к работающему перловому скрипту для
>> отладки.
>> Мне удается подключиться к процессу с помощью gdb+Enbugger<https://metacpan.org/pod/release/JJORE/Enbugger-2.013/lib/Enbugger.pod>,
>> но при попытке поставить breakpoint на строку или вызов метода в модуле,
>> отладчик всегда пишет, что не может её найти.
>> С каноническим примером perl -E ' while(1) {...}' получается, а если
>> соорудить минимальный скриптец с AE -- ни в какую.
>>
>> Тестовый скрипт:
>>
>> *debug_test.pl <http://debug_test.pl>:*
>> *#!/usr/bin/env perl*
>>
>> *use strict;*
>> *use warnings;*
>>
>> *use AnyEvent;*
>>
>> *use lib 'lib';*
>> *use DebugTest;*
>>
>> *my $cv = AE::cv;*
>>
>> *DebugTest->run();*
>> *$cv->recv();*
>>
>>
>> *lib/DebugTest.pm:*
>> *package DebugTest;*
>>
>> *use v5.10;*
>> *use strict;*
>> *use warnings;*
>>
>> *my $timer_w;*
>> *my $signal_w;*
>>
>> *our $i;*
>>
>> *sub run {*
>> *  $timer_w  = AE::timer 1, 1, sub { _say( ++$i ) };*
>> *  $signal_w = AE::signal USR1 => sub { _say( 'USR1 received' ) };*
>> *}*
>>
>> *sub _say {*
>> * say @_;    # <<<<<<< вот сюда бы breakpoint поставить*
>> *}*
>>
>> *1;*
>>
>> Если запускать обычным способом perl -d debug_test.pl, breakpoint без
>> проблем устанавливается и срабатывает.
>> Если цепляться через gdb+Enbugger, не получается:
>> *Enter h or `h h' for help, or `man perldebug' for more help.*
>>
>> *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):*
>> *1: eval{require Enbugger;warn
>> q(stopping);$ENV{PERLDB_OPTS}='RemotePort=localhost:4000';Enbugger->stop;};print
>> STDERR $@*
>> *  DB<1> *
>> *  DB<2> l*
>> *1==> eval{require Enbugger;warn
>> q(stopping);$ENV{PERLDB_OPTS}='RemotePort=localhost:4000';Enbugger->stop;};print
>> STDERR $@*
>> *2 ;*
>> *  DB<2> T*
>> *$ = 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*
>> *. = 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*
>> *. = AnyEvent::CondVar::Base::recv(ref(AnyEvent::CondVar)) called from
>> file `debug_test.pl <http://debug_test.pl>' line 16*
>> *  DB<2> p $DebugTest::i   *
>> *6*
>> *  DB<3> b DebugTest::_say*
>> *Subroutine DebugTest::_say not found.*
>> *  DB<4> *
>>
>>  Может кто знает как это побороть?
>>
>> --
>>   С уважением,
>>   Вадим Власов
>>   т.: +7 (916) 424-00-72
>>
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>
>>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>


-- 
  С уважением,
  Вадим Власов
  т.: +7 (916) 424-00-72
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20131206/2483306d/attachment-0001.html>


Подробная информация о списке рассылки Moscow-pm