mam jakiś kod Perl, który działa poprawnie poza debugera:Dlaczego ten blok Perl BEGIN działa inaczej w debugerze?
% perl somefile.pl
ale gdy uruchamiam go wewnątrz debuggera:
% perl -d somefile.pl
zachowuje się inaczej.
Pliki, o których mowa (jest ich kilka) są częścią zestawu testów dla dużego modułu Perla (~ 20K wierszy kodu). Testy wykonują wiele prac konfiguracyjnych podczas kompilacji i używają bloków BEGIN. Oto niektóre minimalne Kod reprodukcji:
BEGIN
{
package MyEx;
sub new { bless {}, shift }
package main;
eval { die MyEx->new };
if([email protected])
{
die "Really die" unless([email protected]>isa('MyEx'));
}
}
print "OK\n";
Jeśli umieścisz że w somefile.pl
i uruchomić go, drukuje „OK”, jak oczekiwano. Jeśli uruchomić go w debugera z perl -d somefile.pl
, umiera z tego błędu:
Can't call method "isa" without a package or object reference ...
Skutek jest taki, że [email protected]
nie jest obiektem, kiedy uruchamia kod pod debugger. Zamiast tego, jest to unblessed skalarne zawierające ten ciąg:
" at somefile.pl line 9
eval {...} called at somefile.pl line 9
main::BEGIN() called at somefile.pl line 16
eval {...} called at somefile.pl line 16
"
(nowe linie wewnętrzne i odstęp zachowany To dosłowny tekst, nawet „...” s.).
muszę kodu tak, aby uruchomić w debugerze. Używanie debuggera w zestawie testów jest ważną częścią mojego przepływu pracy. Moduł używa obiektów wyjątku i wykonuje wiele rzeczy podczas kompilacji i oczekuje, że obiekt zostanie rzucony jako obiekt podczas przechwytywania.
Moje pytanie (w końcu) brzmi: jak mogę to uruchomić? Czy jest w pobliżu praca? Czy jest to błąd w module debuggera perla? Jaki jest najlepszy sposób, aby rozwiązać ten problem? (Wiem, że to kilka pytań, ale wszystkie są powiązane.)
Używam perl 5.10.0 na Mac OS X 10.5.5.
dieLevel rzeczą sugerowane przez Adam Bellaire wyglądał obiecująco i rzeczywiście coś (nie może dowiedzieć się, co) jest ustawienie go na 1 dla mnie. Ale ustawiłem go na 0, używając pliku ~/.perldb
, a problem nadal występuje. W rzeczywistości, mogę ustawić wszystkie trzy powiązanych ustawień 0. My ~/.perldb
plik:
parse_options('dieLevel=0 warnLevel=0 signalLevel=0');
potwierdziłem, że ustawienia są w rzeczywistości, uruchamiając komendę o
w debuggera. Widzę je wszystkie ustawione na 0, gdy uruchamiam perl -de 0
, a także podczas uruchamiania rzeczywistego pliku somefile.pl
.
Dzięki, Brian. Użyłem perlbug
do zgłoszenia błędu (RT 60890) i zacząłem kropić local $SIG{'__DIE__'}
we wszystkich odpowiednich miejscach w moim kodzie. (I również zauważyć, że w błąd perldoc perldebug
wciąż wydaje się sugerować, że domyślna dieLevel
0.)
Jesteś odważniejszym mężczyzną niż ja, Brian. Za każdym razem, gdy myślę o poklepywaniu w perl5db, dostaję się do komentarzy na temat tego, co jest splątanym bałaganem, ponieważ traci moją motywację. –