2

私は、JavaScriptコード、HTML DOM、およびネットワークの読み込みをデバッグするためにFirebugを使用することを本当に楽しんでいます。つまり、Web開発に関するすべてのクライアント側です。

サーバー側の状況はそれほど明るくありません。私が取り組んでいるアプリケーションは、CGIDBIなどの必須の標準モジュールでPerlを使用しています。標準のトラブルシューティング手法は知っていますが、データベースクエリや関数呼び出しなどをトレースして、優れた出力を提供するデバッグツールはないようです。

特に、出力はSTDOUT(想像Content-Type: application/json)またはSTDERR(エラーログを取得するのは非常に不快です)でヤンクするだけでなく、ツールでコアモジュールに手動でモンキーパッチを適用したりuse Data::Dumper; print '<pre>',Dumper($foo),'</pre>'、コード全体に散らばったりする必要はありません。

簡単に言うと、Perl / CGIのサーバー側のデバッグをクライアント側のFirebugと同じくらい楽しくするツールはありますか?

4

3 に答える 3

7

はい、ありますが、それらはPlackに依存しています。Plack は、Web フレームワークと Web サーバーの間に位置するレイヤーです。Plack は、サーバーの違いをスムーズにし、あらゆる種類のデバッグ ツールをプラグインする場所を提供します。これらには、データベースプロファイルトレース情報が含まれ、独自のデバッグ パネルを作成できます。インタラクティブなデバッガーもありますが、私自身は使用していません。

最近の多くの Perl Web フレームワーク (Catalyst や Dancer など) は Plack を使用していますが、そのままの Perl と CGI を使用している場合は、Plack を使用することはできません。幸いなことに、CGI アプリケーションを Plack で実行するのは非常に簡単です。CGI を Plackを使用するサブクラスに置き換える、エミュレーション レイヤーで CGI コードをラップします

Plack への変換には、デバッグ ツール以外にも多くの利点があり、努力する価値は十分にあります。

于 2012-08-06T01:57:19.117 に答える
6

いいえ、そうではありません。

あなたができることは次のとおりです。

コードにデバッグ コードを振りかけます。

use constant DEBUG => 1;
...;
debug_function($var) if DEBUG;

展開のために定数を設定解除するDEBUGと、追加のランタイム コストは発生せず (ステートメントは最適化されて除去されます)、必要に応じてそれらを再度有効にすることができます。

みたいな悪口も言える

BEGIN {require Data::Dumper if DEBUG}

条件付きでデバッグ モジュールをロードします。

コア関数をオーバーライドしたい場合は、デバッグ ハンドラを追加してみませんか? それは邪悪なパッチではなく、増強です…</p>

BEGIN {
   if (DEBUG) {
      my $oldfunction = \&CORE::function;
      *CORE::function = sub {  # add prototypes if you like them
         debug_handler(@_);
         &$oldfunction;
      };
   }
}

この手法を使用して、呼び出しをデータベースに記録します。

STDERRいくつかの特別なファイル(またはパイプ、またはターミナル、または…)を再度開くことができます

BEGIN {
   if (DEBUG) {
      close STDERR or die "STDERR hates me and doesn't want to be closed.";
      open STDERR, '>', "/path/to/my/error/log.file" or die "couldn't open error log";
   }
}

DIEおよびWARNハンドラを定義して、必要なことを行うことができます

$SIG{__WARN__} = sub {
    print MYERRORS "There was a warning: $!";
    # do additional error handling unless you're paranoid
}

プラグマは、重要な警告を致命的にするのwarningsに役立ちます:

use warnings qw(FATAL importantWarning);

または、独自の警告を作成するには、ドキュメントを参照してください

また、コール スタック トレースを取得するには、関数のさまざまな可能性を調べcallerます。基本的に、ニーズに合わない可能性があるため、Carpモジュールの個人的な解釈を作成することをお勧めします。CGI::Carp

于 2012-08-05T16:35:46.520 に答える
1

上記に加えて、名前付きサブルーチンがいつ呼び出されたかを知ることができるDevel::LTrace、どのサブルーチンがいつどこで呼び出されたかを知ることができる Devel::CallTrace を確認してください。

于 2012-11-12T14:26:47.193 に答える