2009-10-16 33 views
5

Tôi muốn có thể (hợp lý) tùy ý thiết lập điểm thực hiện của mình trong trình gỡ lỗi Perl. Ví dụ: di chuyển ngay lập tức trước nếu từ cơ thể của if và thiết lập một biến.Làm cách nào để di chuyển điểm hướng dẫn trong trình gỡ lỗi Perl?

Lục lọi xung quanh perldebug (và perldebguts và trang trình gỡ lỗi perl POD) cho thấy loại chức năng này không được hỗ trợ hoặc không được ghi lại.

+3

Tôi đang cố gắng tưởng tượng những gì bạn muốn làm, nhưng không thể. Tôi sẽ đoán thay thế. B :: Util hoặc B :: Hooks :: OP :: Kiểm tra có thể hữu ích; chỉnh sửa optree và thiết lập op tiếp theo cho cái bạn muốn thực thi; hoặc móc một mã op và chạy khi nó được thực hiện. Một runloop tùy chỉnh cũng có thể hữu ích. Nhưng về cơ bản, bạn ở một mình ở đây; du hành thời gian không phải là một tính năng của perl5db. – jrockway

+0

Không đi du lịch thời gian. Tôi đang tìm cách tùy ý thiết lập thời điểm thực hiện cho một vị trí cụ thể, * mà không cần phải quan tâm nhiều lắm * vì sự tỉnh táo của việc làm như vậy. –

+0

Tùy chỉnh runloop âm thanh tốt sau đó. Những gì bạn muốn làm là rất lạ, mặc dù, đó là lý do tại sao nó không được thực hiện. – jrockway

Trả lời

-1

Điều này không thể thực hiện được với trình gỡ lỗi hiện có.

+0

Chờ một giây, cho đến giờ mọi câu trả lời là "không" và tôi được bình chọn? Có thật không? – nick

+1

Câu trả lời của bạn không phải là "không". Câu trả lời của bạn chỉ cho chúng tôi biết bạn không tin điều gì. Điều đó không có vẻ rất tự tin. Vì vậy, bạn không thực sự biết câu trả lời, và bạn không có thay thế để đề nghị. Câu trả lời của bạn không hữu ích, và do đó xứng đáng với một cuộc bỏ phiếu tiêu cực. (Tôi nghĩ -1 là đủ, vì vậy tôi không bỏ phiếu cho nó bản thân mình.) Bên cạnh đó, các câu trả lời khác không phải là "không", một trong hai. Đó không phải là câu hỏi có/không. Đó là một câu hỏi "như thế nào". Nếu bạn không biết làm thế nào, và bạn không biết rằng nó là không thể, sau đó những gì đóng góp sẽ trả lời của bạn thực sự làm cho? –

0

Điểm ngắt chỉ có thể được đặt trên dòng đầu tiên của câu lệnh.

+0

Tôi không muốn đặt điểm ngắt. Tôi muốn di chuyển điểm thực hiện của mình - con trỏ chỉ dẫn của máy ảo Perl. –

+2

Điều Phao-lô đang đòi hỏi không phải là những điểm ngắt. Trong khi chương trình bị tạm dừng, Paul muốn chỉ vào một dòng cụ thể và nói, "Tiếp tục chạy ngay tại đây, ngay bây giờ. Đừng chạy gì thêm trước." Điểm ngắt không cho phép bạn bỏ qua mã hoặc mã chạy lại mà bạn vừa mới chuyển. Di chuyển IP. –

+1

Rob đã đúng. –

1

Giải pháp thay thế phức tạp là thêm nhãn và điều kiện goto báo cáo trong suốt mã của bạn. Nhưng tùy thuộc vào mức độ bạn muốn mô phỏng tính năng này một cách tồi tệ, nó có thể đáng giá. phiên gỡ lỗi

POINT1: $GOTO="";  # $GOTO is our fake variable that we only set from the debugger 
($a,$b,$c)=(1,2,3); 
POINT2: $GOTO=""; 
if ($a < $b) { 
    goto $GOTO if $GOTO; 
    if ($a > $c) { 
     goto $GOTO if $GOTO; 
     print "foo\n"; 
    } else { 
     goto $GOTO if $GOTO; 
     print "bar\n"; 
    } 
    goto $GOTO if $GOTO; 
} else { 
    goto $GOTO if $GOTO; 
    print "nothing\n"; 
    goto $GOTO if $GOTO; 
} 

mẫu:

$ perl -d debuggoto.pl 

Loading DB routines from perl5db.pl version 1.28 
Editor support available. 

Enter h or `h h' for help, or `man perldebug' for more help. 

main::(debuggoto.pl:1): POINT1: $GOTO="";  # $GOTO is our fake variable that we only set from the debugger 
    DB<1> n 
main::(debuggoto.pl:2): ($a,$b,$c)=(1,2,3); 
    DB<1> 
main::(debuggoto.pl:3): POINT2: $GOTO=""; 
    DB<1> 
main::(debuggoto.pl:4): if ($a < $b) { 
    DB<1> 
main::(debuggoto.pl:5): goto $GOTO if $GOTO; 
    DB<1> 
main::(debuggoto.pl:6): if ($a > $c) { 
    DB<1> 
main::(debuggoto.pl:10):    goto $GOTO if $GOTO; 
    DB<1> 
main::(debuggoto.pl:11):    print "bar\n"; 
    DB<1> 
bar 
main::(debuggoto.pl:13):   goto $GOTO if $GOTO; 
    DB<1> $GOTO="POINT2" 

    DB<2> n 
main::(debuggoto.pl:3): POINT2: $GOTO=""; 
    DB<2> $c=0 

    DB<3> n 
main::(debuggoto.pl:4): if ($a < $b) { 
    DB<3> 
main::(debuggoto.pl:5): goto $GOTO if $GOTO; 
    DB<3> 
main::(debuggoto.pl:6): if ($a > $c) { 
    DB<3> 
main::(debuggoto.pl:7):  goto $GOTO if $GOTO; 
    DB<3> 
main::(debuggoto.pl:8):  print "foo\n"; 
    DB<3> 
foo 
main::(debuggoto.pl:13):   goto $GOTO if $GOTO; 
    DB<3> 
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<3> 
Use `q' to quit or `R' to restart. `h q' for details. 
    DB<3> 

Tôi tự hỏi nếu nó sẽ có thể xây dựng một debugger có sử dụng ý tưởng này.

+1

Hunh. Tôi sẽ không muốn * bằng tay * muck với các nguồn đến mức đó, nhưng xây dựng một nguồn sửa đổi & chạy debugger tự động ... bây giờ có một ý tưởng. –

1

Tôi vẫn không chắc chính xác điều này sẽ đạt được, nhưng tôi đặt cược một runloop tùy chỉnh bỏ qua ops bạn không quan tâm cho đến khi bạn bắt đầu chăm sóc lại có thể giải quyết vấn đề của bạn.

Đường chạy tốt để vận chuyển hàng hóa là Runops::Switch. Loại bỏ câu lệnh switch và viết một hàm bỏ qua các op cho đến khi bạn đang chạy cái mà bạn muốn chạy; sau đó chỉ cần gọi vào runloop bình thường để thực sự chạy op đó.

đang liên quan: http://cpansearch.perl.org/src/RGARCIA/Runops-Switch-0.04/Switch.xs

này được tất cả handwaving, tôi chưa bao giờ viết một runloop trước. Ý tưởng goto trong bài viết khác cũng tốt, nhưng điều này liên quan đến việc viết ít mã hơn.

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