xem xét chương trình này nhỏ perl, test.pl
:Trình gỡ rối Perl - ngắt lỗi (ngoại lệ)?
#!/usr/bin/env perl
use warnings;
use strict;
use Number::Format qw(:subs); # sudo perl -MCPAN -e 'install Number::Format'
my $tstr = "";
my $numFormatter = new Number::Format();
for (my $ix=0; $ix<20; $ix++) {
$tstr = $tstr . int(rand(10));
my $ftstr = $numFormatter->format_number($tstr, 2, 1);
print "ix: $ix ; in: $tstr ; out: $ftstr\n";
}
Nếu tôi chạy nó, nó không thành công với một lỗi. Nếu tôi chạy nó trong trình gỡ lỗi Perl, sử dụng perl -d
, nó cũng không thành công với một lỗi:
$ 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.
main::(test.pl:6): my $tstr = "";
DB<1> c
ix: 0 ; in: 6 ; out: 6.00
ix: 1 ; in: 63 ; out: 63.00
ix: 2 ; in: 637 ; out: 637.00
ix: 3 ; in: 6379 ; out: 6,379.00
ix: 4 ; in: 63790 ; out: 63,790.00
ix: 5 ; in: 637906 ; out: 637,906.00
ix: 6 ; in: 6379062 ; out: 6,379,062.00
ix: 7 ; in: 63790624 ; out: 63,790,624.00
ix: 8 ; in: 637906246 ; out: 637,906,246.00
ix: 9 ; in: 6379062467 ; out: 6,379,062,467.00
ix: 10 ; in: 63790624671 ; out: 63,790,624,671.00
ix: 11 ; in: 637906246715 ; out: 637,906,246,715.00
ix: 12 ; in: 6379062467152 ; out: 6,379,062,467,152.00
ix: 13 ; in: 63790624671522 ; out: 63,790,624,671,522.00
round() overflow. Try smaller precision or use Math::BigFloat at test.pl line 11.
at /usr/local/share/perl/5.18.2/Number/Format.pm line 535.
Number::Format::round('Number::Format=HASH(0x9d0b6cc)', 637906246715226, 2) called at /usr/local/share/perl/5.18.2/Number/Format.pm line 601
Number::Format::format_number('Number::Format=HASH(0x9d0b6cc)', 637906246715226, 2, 1) called at test.pl line 11
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
DB<1> p $ix
DB<2>
... nhưng khi nó không thành công, nó không "dừng" ở dòng thất bại, như nói với gdb
một chương trình C có thể làm - chương trình lại kết thúc, và do đó tôi không có biến ngữ cảnh nào để kiểm tra nữa.
Tất nhiên, một vòng như thế này có thể chạy cho hàng ngàn lần, đó là lý do tại sao thiết lập một breakpoint tại dòng có vấn đề và làm một c
ontinue bằng tay sẽ không giúp được gì nhiều ở đây ...
Có cách nào để có trình gỡ lỗi Perl phá vỡ một chương trình khi lỗi/ngoại lệ, sao cho bối cảnh biến cục bộ được giữ nguyên, để kiểm tra các biến đó?
Đó là tốt, nhưng nó chỉ gỡ lỗi rất cụ thể. Bạn có thể muốn mở rộng trên '$ DB :: single'. – simbabque
Tuyệt vời - cảm ơn vì điều đó, @DiabJerius – sdbbs
@simbabque Tôi hiểu ý của bạn. Nhưng bên quan tâm sẽ nói "cái quái gì thế này là 'eval' và dòng nhiễu đó' $ @ ', và' $ DB :: single' ?? " và sẽ tìm kiếm và tìm hiểu nhiều hơn tôi có thể làm ở đây. Và bên không quan tâm sẽ vận chuyển hàng hóa, nó sẽ xảy ra bất kể. Một số liên kết đến tài liệu phù hợp và tôi sẽ thêm chúng. –