2

コマンドを使用して式だけでなく変数の監視を追加できることは知っていますが、w各コマンドを単純に解析し、特定のテキストがそのコマンドに含まれている場合に停止するように指示することはできますか?

w m/bad command/whereのようなもの$_は、実行中の次のコマンドを含む文字列です。

perl -d現在、Windows で Komodo を使用してリモート CGI デバッグを行っていますが、Linux シェルでも使用できます。


更新

これをより明確にしようとします。ディスク上のデータが削除されているファイルがあり、どこにあるかわかりません。私がデバッグしているプログラムは、相互に必要な多数の .pl ファイルで構成されており、完全なコードベースはさらに大きくなっています。もちろん、データ ファイルの名前の一部 (拡張子はわかっています) またはunlink. しかし、自分のプログラムでどのコード ファイルが使用されているかがわからないため、これではどうにもなりません。

デバッグするこのコードについて考えてみましょう。

if ($foo == 1) {
  unlink 'filename.example';
}

これをデバッグしているとき、次に実行しようとしている (スクリプトからの) perl コマンドに/example/. 次のコマンドの実行前に実行されるようなフックが必要です。

そうすれば、ブレークしたいものがどこにあるか (どの行またはファイルのように)を知る必要がなく、変数名も必要ありません (何もないため)。

これを説明するのは奇妙だと思いますが、よくある問題かもしれないと思いました。たぶん、まったく別のアプローチがありますか?

4

5 に答える 5

5

ウォッチポイントは「w」コマンドで設定されます:

 BD<1>  w  $cannonballs

$cannonballs が変更されるたびにプログラムが壊れます。

 BD<1> w $i == 19

$i の値が 19 に設定されると壊れます。たとえば、

 $ cat  foo.pl 

 foreach $i ( 0..100 ) {
    print "$i\n";
 }

 $ perl -d foo.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::(foo.pl:2):       foreach $i ( 0..100 ) {   
   DB<1> w $i == 3   
   DB<2> c 
 0 
 1 
 2 
 Watchpoint 0:   $i == 3 changed:
     old value:  ''
     new value:  '1' 
 main::(foo.pl:3):          print "$i\n";   
   DB<2> p $i 
 3   
   DB<3> q 
 Watchpoint 0:   $i == 3 changed:
     old value:  '1'
     new value:  '' 
   DB<3> q
 $

おそらく、変数の完全な名前空間を使用することをお勧めします。そうしないと、同じ名前の変数がスコープに出入りするたびにブレークが発生します。

于 2012-11-02T14:29:12.867 に答える
4

私はあなたが望むことを正確に実行するモジュールを知りませんが、Devel :: Traceは実行される前にすべての行を出力する非常に小さなモジュール(20行のコード)です。

そのサブクラスを作成し、コードが目的の文字列と一致する場合は、DB::DBサブルーチンを変更して$DB:: single=1に設定できます。

例を含むより詳細な説明については、Devel::Traceに関するbriandfoyの投稿を参照してください。

于 2012-11-02T21:19:17.287 に答える
0

デバッガーはすでにそれを行うことができます (まあ、ほぼ)。ウォッチ式とは呼びませんが、ブレークポイントと呼びます。

行と条件にブレークポイントを設定できます。

b 33 /pattern/i

ただし、行番号を指定する必要があります。Perl のデバッグを参照してください。

于 2012-11-02T13:47:46.443 に答える
0

を使用してコードにブレークポイントを設定できます

$DB::single = 1;

監視構成でブレーク ポイントを使用するには、監視対象に一致する条件でブレークを囲みます。

あなたの場合:

if ( $command =~ /example/ ) {
    $DB::single = 1;
}

奉仕すべきです。

于 2015-04-30T15:41:39.550 に答える
-1

を確認してくださいTie::Trace。変数の値が変更された場所を警告することができます。$DB::single=1変数の値が変更されるたびにデバッガーを中断する式でハックすることもできると思います。

于 2012-11-02T14:17:32.183 に答える