と以外にPerlプログラムをデバッグする他の方法はData::Dumper
ありperl -d
ますか?
18 に答える
Perlには、デバッグや同様のタスクに使用できるツールがいくつかあります。
組み込みのコマンドラインデバッガー。
perl -d yourcode.pl
AndrewE.PageによるPerl/Tkベースのグラフィカルデバッガー。
これは、 Lispで書かれたLinuxとWindowsの両方で実行される無料のツールです。ソースコードは利用できません。
PerlRegexデバッガーとMarkJasonDominusによって書かれたそれに関する記事。
あなたを助けるためにそこにたくさんのものがあります:
- Devel::Trace - 実行するすべての行を出力します
- Carp::REPL
*
-コードが警告をスローしたときにREPL にドロップする - Devel::ebug - Perl コードから制御できるデバッガー
- Enbugger - プロセスがデバッグで開始されたかどうかに関係なく、実行時にデバッガを使用します
私はDevel::Traceが好きです。基本的に、実行ダンプを提供し、コード パスを示します。
別の側面として、テスト駆動型開発は現在大流行しているため、非常に高度なテスト用のDevel::NYTProfなどのプロファイリング ツールにも関心があるかもしれません。興味深い概要については、このTim Bunce のブログ投稿を参照してください。
ステップバイステップのデバッグにはActiveState Komodoを使用します。
Eclipseには、 EPIC プラグイン用のステップ バイ ステップ デバッガーがあります。
個人的には ActiveState バージョンの方が好きです。より堅牢で安定しているように見えますが、コストがかかります (そして、作業は私にお金を払っています)。それが私のお金だったら、無料の Eclipse と EPIC を使うでしょう。
最適なデバッグ手段は、小さなルーチン、短いスコープ、制限された副作用、および多数のテストです。バグが孵化する前に停止します。
私の通常のツールの範囲は次のとおりです。
- 単純な場合の print ステートメントと Data::Dumper
- パール -d
通常はそれで十分です。dddがあります。とてもいいとは聞いていましたが、遊んだことはありませんでした。
一部のタスク (実際にはデバッグではありませんが、デバッグに近いもの) では、Devel::NYTProfを使用します。
一部の人々はprint
、コードが実行すると思っていたことを実行していないプログラムのセクションで何が起こっているかを確認するためにステートメントを使用します。(つまり、特定の実行ポイントで変数に実際に含まれているものを確認する方法として。)
何をしているかにもよりますが、Log::Log4perlは、特に大きなアプリケーションでデバッグの「印刷」スタイルを管理する簡単な方法を提供します:
- さまざまなログ レベル (デバッグ、情報、エラー、警告、および致命的) を提供します。
- 構成ファイルから制御 (たとえば、開発ボックスでのデバッグが容易で、生産ボックスでのエラーのみ)
- アプリケーションのセクションごとに構成可能 (たとえば、あるレベルの 1 つのログ ファイルの Web アプリケーション、別のログ レベルの別のログ ファイルのcronスクリプト)
- クラスごとに構成可能 - ノイズの多いモジュールを簡単に静かにしたり、アプリケーションの奥深くに詳細なデバッグを追加したりできます
Test :: Moreは基本的なテストを書くためのもので、Hook :: LexWrap、Test :: MockObject、Test :: Deep、Test :: MockTime、Test :: WWW::Mechanizeなどの高度なテストを書くためのものです。
サブパラメータをチェックするためのAttribute::Signature。Carp::Assertはコントラクトベースのプログラミング用です。
Devel :: Ebug::WxまたはDevel::ptkdb(およびすぐにPadreでのより良いサポート)を使用して、デバッグを容易にすることができます。
Emacs さん、率直に言ってください:
emacs my_script.pl
M-x perldb
Emacs はあなたにプロンプトを表示します:
Run perldb (like this): perl my_script.pl
Hit enter (or add command line switches)
通常どおりデバッガを使用します。
コードの実行を続行するには、「c」と入力します。実行すると、コードがコードに従います。
Emacs はそのデバッガーと完全に統合されており、Perl コードのデバッグがほとんど簡単になります。
個人的に、私はSmart::Commentsの大ファンです。これにより、トレースが非常に簡単になり、再度削除する必要もありません。
use Smart::Comments -ENV;
...
sub myroutine {
my ($self, @args) = @_ ;
### args: @args
...
}
環境に が設定されている場合Smart_Comments
、### で始まる行はデバッグ出力に変換され、Dumper()
自動的に使用されます。環境変数が設定されていない場合、デバッグは完全に無効になります。
たくさんの機能があり、進行状況バー、警告、中止条件、および単純な古いデバッグ出力を生成します。
適切なテストはすべて良いものであり、優れたテスト駆動開発(TDD) 開発方法論を否定しているわけではありませんが、既存のバグの真相を突き止めようとする場合は、Smart::Commentsが有効です。
最も洗練されたシームレスなステートレス デバッグにはDevel::SimpleTraceを使用します。
perl -MDevel::SimpleTrace -we'warn "main"; sub foo{ warn "outer"; sub { warn "inner" } }; foo()->()'
気に入らない場合はperl -d
、Devel::REPLとCarp::REPLがどちらも優れた代替手段です。
開発中、次のようなデバッグ フラグで有効にできる戦略的な場所 (あまり多くない場所) に printf ステートメントを埋め込むのが好きです。
printf("h='$h', j='$j', ... (%d)\n", __LINE__) if $debug;
ここで、デバッグ フラグはスクリプトの先頭で定義されます。
my $debug = $ENV{DEBUG} || 0;
すべての printf 行をコメントアウトすることを忘れないようにする代わりに、次のようにスクリプトを実行するだけです。
DEBUG=1 ./script.pl
すべての本番環境の準備が整ったときにテストした後、デバッグ行を削除できます。
cat script.pl | grep -v 'if $debug;'
一般的に私は使用します
perl -d
デバッグ用。
Eclipse 用のEclipse Perl Integration (EPIC) プラグインを使用することもできます。EPIC Perl 開発環境と統合された豊富なデバッグ環境を提供します。あなたはそれを使うことができ、それは一般的に役に立ちます。
テストを書くことでデバッグ時間を大幅に短縮できると思います。
CGI::Dump
Benchmark
Command-line options
__DATA__ & <DATA>
$.
__FILE__ & __LINE__
warn() & die()