2011-01-14 26 views

Trả lời

7

Bạn đã thử thêm công tắc -d vào dòng shebang ở đầu tập lệnh của mình chưa? Một cái gì đó như

#!/usr/bin/perl -d 
use strict; 
use warnings; 
$|=1;$\="\n"; 

print "Test"; 

Nó thực sự phụ thuộc chính xác cách nó được khởi chạy, nhưng ít nhất trong trường hợp đơn giản, điều này sẽ bắt đầu trình gỡ lỗi.

Edit: Sau đó bạn có thể thiết lập một breakpoint trên một dòng cụ thể với một điều kiện nhất định sử dụng

> b [line] [condition] 

và nhấn

> c 

để tiếp tục chạy kịch bản - trình gỡ lỗi sẽ dừng lại ở dòng được chỉ định khi điều kiện được đáp ứng

+0

Điều đó thật tuyệt. Có cú pháp tương tự trên cửa sổ không? – Thomson

+1

Tôi tin rằng perl sẽ tôn trọng các thiết bị chuyển mạch ngay cả khi thực thi perl thực thi khởi chạy không phải là một danh sách trong shebang - tức là, ngay cả khi kịch bản trên được bắt đầu như, nói, C: \ Perl \ bin \ perl.exe script.pl , nó vẫn nên bắt đầu trình gỡ rối – ivancho

3

Vâng, có điều gì đó sẽ cho phép bạn làm điều gì đó giống như điểm ngắt, nhưng chức năng rộng hơn: Perl Debugger.

+0

Điều này có thể hoạt động khi tôi không thể thay đổi phương thức khởi chạy (dòng lệnh thành perl có thể thực thi) không? – Thomson

+1

phương pháp khởi chạy là cần thiết, bạn không thể sử dụng trình gỡ lỗi mà không có tùy chọn -d – Thariama

2

Về cơ bản, chuyển đổi -d cho phép bạn giao tiếp với thực thi perl và cho phép thực thi perl giao tiếp với bạn.

More

+0

Đoạn mã perl của tôi là một phần của hệ thống lớn và tôi không thể kiểm soát cách khởi chạy. Có vẻ như tôi chỉ có thể sửa lại tệp nguồn để làm như vậy. – Thomson

+3

@Thomson Tan: Trong trường hợp đó, việc ghi nhật ký sẽ hoạt động tốt hơn. Hãy xem [Log :: Log4perl] (http://search.cpan.org/perldoc?Log::Log4perl). –

34

Nếu tôi hiểu bạn một cách chính xác, bạn cần phải sử dụng một biến debugger cụ thể trong mã của bạn - $DB::single. Đặt giá trị này thành giá trị thực trong mã của bạn sẽ khiến trình gỡ lỗi dừng lại trên dòng đó.

$x = 1234; 
$DB::single = 1; 
enter_problematic_sub_now(); 

Mã của bạn sau đó sẽ dừng lại ở phù hợp với $ DB :: set duy nhất để 1.

Tất nhiên, nếu bạn không thể thực sự đảm bảo rằng mã của bạn đang chạy trong trình gỡ lỗi sau đó bạn có một vấn đề khác hoàn toàn. Bạn cũng sẽ cũng cần chạy mã của bạn qua perl -d.

+0

Bạn có nghĩa là nếu chương trình của tôi không chạy trong trình gỡ lỗi, tôi không thể sử dụng $ DB :: đơn như mong đợi? – Thomson

+3

@Thompson: Vâng, đúng vậy. Nếu bạn muốn chương trình Perl được gỡ lỗi, bạn phải chạy chương trình đó dưới trình gỡ lỗi. Theo hiểu biết tốt nhất của tôi, loại điều này đúng với hầu hết các loại gỡ lỗi thời gian thực dựa trên mã nguồn bằng các ngôn ngữ khác - sau khi xuất hiện các đoạn coredumps. – tchrist

+0

@tchrist Tôi không chắc nó hoạt động như thế nào trong Python, nhưng tôi có thể làm 'import pdb; pdb.set_trace() 'bất cứ nơi nào trong mã để phá vỡ tại điểm đó và nhập trình gỡ lỗi. Tôi không phải chạy tập lệnh với bất kỳ công cụ sửa đổi gỡ lỗi đặc biệt nào. –

Các vấn đề liên quan