2009-10-16 10 views
5

Perlデバッガで私の実行ポイントを(合理的に)任意に設定できるようにしたいと思います。たとえば、ifの直前にifの本文から移動し、変数を設定します。Perlデバッガで命令点を移動するにはどうすればよいですか?

perldebug(とperldebgutsとperlデバッガーPOD)ページをぶらつくと、この種の機能がサポートされていないか、または文書化されていないことが示唆されます。

+3

私はあなたがしたいことを想像しようとしていますが、できません。代わりに私は推測する。 B :: UtilまたはB :: Hooks :: OP :: Checkが役に立ちます。 optreeを編集し、次のopを実行したいopに設定します。 opを実行し、実行時にコードを実行することができます。カスタムrunloopも役に立ちます。しかし、基本的に、ここにあなた自身がいます。時間旅行はperl5dbの機能ではありません。 – jrockway

+0

時間旅行ではありません。私は任意の場所に実行時間のポイントを任意に設定しようとしています*大したことなし*そうすることの正当性。 –

+0

カスタムrunloopは良い音です。あなたがしたいことは非常に奇妙ですが、それが実装されていない理由です。 – jrockway

答えて

-1

これは既存のデバッガでは実行できません。

+0

もう一度、すべての答えが「いいえ」で、私は投票しますか?本当に? – nick

+1

あなたの答えは「いいえ」ではありませんでした。あなたの答えは、あなたが信じていないことだけを教えてくれました。それは非常に自信を持って聞こえません。だからあなたは実際に答えを知らないし、あなたは示唆するための選択肢がない。あなたの答えは役に立たなかったので、否定的な投票にふさわしいものでした。 (私は-1で十分だと思ったので、私は自分でそれに投票しませんでした。)さらに、他の答えは "いいえ"ではありませんでした。はい/いいえの質問ではありませんでした。それは "どのように"の質問でした。あなたがどのようにわからなくて、それが不可能であることを知らないなら、本当にあなたの答えがどんな貢献をしますか? –

0

ブレークポイントは、ステートメントの最初の行にのみ設定できます。

+0

私はブレークポイントを設定するつもりはありません。実行ポイント、つまりPerl VMの命令ポインタを移動したい。 –

+2

Paulが求めているのは、ブレークポイントの機能ではありません。プログラムが一時停止している間、Paulは特定の行を指し示し、「今すぐここで実行し直してください。事前に何も実行しないでください」と言います。ブレークポイントでは、コードをスキップしたり、直前に渡したコードを再実行したりすることはできません。 IPは移動します。 –

+1

ロブが正しいです。 –

1

コード全体にラベルと条件付きgotoステートメントを追加するのは面倒な回避策です。しかし、この機能をエミュレートするのがどれほど難しいかによっては、それが価値があるかもしれません。

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; 
} 

サンプルデバッグセッション:

$ 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> 

このアイデアを使用して、デバッガを構築することが可能になるのだろうか。

+1

Hunh。そのレベルのソースを手作業で手に入れたくないのですが、自動化されたソースをビルドしてデバッガを修正して実行するようになりました。今は考えがあります。 –

1

私はまだこれが達成されるとは確信していませんが、あなたが気にしない操作をスキップするカスタムランローフは、あなたの問題を解決するかもしれないという思いがあります。

カーゴ・カルトへのラン・ループは、Runops::Switchです。 switch文を削除し、実行したい操作があるまで操作をスキップする関数を作成します。実際にそのオペレーションを実行するために通常のrunloopを呼び出してください。

関連するコード:http://cpansearch.perl.org/src/RGARCIA/Runops-Switch-0.04/Switch.xs

これは、すべてのhandwavingですが、私は前に実行ループを書いたことがありません。別の投稿のgotoのアイデアも良いですが、これは少ないコードを書くことです。

関連する問題