Tôi có một số mã Perl chạy tốt ngoài debugger:Tại sao khối lệnh Perl BEGIN này hoạt động khác trong trình gỡ lỗi?
% perl somefile.pl
nhưng khi tôi chạy nó bên trong trình gỡ lỗi:
% perl -d somefile.pl
nó cư xử khác nhau.
Các tệp được đề cập (có một số) là một phần của bộ thử nghiệm cho mô-đun Perl lớn (~ 20K dòng mã). Các bài kiểm tra làm rất nhiều công việc thiết lập tại thời gian biên dịch và sử dụng khối BEGIN. Đây là một số mã sinh sản tối thiểu:
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";
Nếu bạn đặt mã đó vào somefile.pl
và chạy nó, nó in "OK" như mong đợi. Nếu bạn chạy nó trong trình gỡ lỗi với perl -d somefile.pl
, nó chết với lỗi này:
Can't call method "isa" without a package or object reference ...
Kết quả là [email protected]
không phải là một đối tượng khi mã chạy dưới trình gỡ lỗi. Thay vào đó, nó là một đại lượng vô hướng không được ban phước chứa chuỗi này:
" 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
"
(dòng mới nội và khoảng cách bảo quản Đó là văn bản theo nghĩa đen, ngay cả những "..." s..)
Tôi cần có mã như thế này để chạy trong trình gỡ rối. Sử dụng trình gỡ rối trong bộ kiểm thử là một phần quan trọng trong quy trình làm việc của tôi. Module sử dụng các đối tượng ngoại lệ và thực hiện rất nhiều thứ tại thời gian biên dịch và hy vọng một đối tượng được ném vào là một đối tượng khi bị bắt.
Câu hỏi của tôi (cuối cùng) là: Làm thế nào tôi có thể làm việc này? Có cách giải quyết nào không? Đây có phải là lỗi trong mô-đun trình gỡ lỗi perl không? Cách tốt nhất để giải quyết vấn đề này là gì? (Tôi biết đó là một số câu hỏi, nhưng tất cả đều có liên quan.)
Tôi đang sử dụng perl 5.10.0 trên Mac OS X 10.5.5.
Điều chết người được đề xuất bởi Adam Bellaire trông đầy hứa hẹn, và thực sự là điều gì đó (không thể tìm ra điều gì) đang đặt nó thành 1 cho tôi. Nhưng tôi đặt nó bằng 0 bằng cách sử dụng tệp ~/.perldb
và sự cố vẫn tiếp diễn. Trong thực tế, tôi đặt tất cả ba của các thiết lập liên quan đến 0. ~/.perldb
tập tin của tôi:
parse_options('dieLevel=0 warnLevel=0 signalLevel=0');
Tôi khẳng định rằng các thiết lập có hiệu lực bằng cách chạy lệnh o
trong trình gỡ lỗi. Tôi thấy tất cả chúng được đặt thành 0 khi tôi chạy perl -de 0
và cũng có thể khi chạy tệp somefile.pl
thực tế.
Cảm ơn, brian. Tôi đã sử dụng perlbug
để gửi lỗi (RT 60890) và tôi đã bắt đầu rắc local $SIG{'__DIE__'}
vào tất cả các vị trí thích hợp trong mã của tôi. (Tôi cũng lưu ý trong các lỗi mà perldoc perldebug
vẫn dường như ngụ ý rằng mặc định dieLevel
là 0.)
Bạn là một người dũng cảm hơn tôi, brian. Mỗi lần tôi suy nghĩ về poking xung quanh trong perl5db tôi nhận được để các ý kiến về những gì một rối rối nó là như mất động lực của tôi. –