実践的Perlデバッグ三種の神器

  • 83
    いいね
  • 0
    コメント

perlでprintfデバッグするにはData::Dumperがおなじみかと思いますが、printfデバッグでは「○○が××なのではないか」という仮説を1つずつ検証していくことになり大変なときもあります。Perlはスタックトレースとかをあまり吐いてくれないし大変だと思いきや、エラーの可視化などに便利なモジュールがあったのでメモりました。

変な場所でdieまたはwarnが出て困っている場合 => Carp::Always

warnまたはdieが出た時に、スタックトレースを引数付きで表示してくれます。warnやdieが出るが、どこから呼び出された時に、どんな引数のときにで出ているのかわからない場合に便利です。
※ Carp::Always::Colorというモジュールもあるようですが、まだ試していません。

エラーメッセージが少なすぎたので
エラーメッセージが少なすぎ

use Carp::Always;を適当な場所に追加(読み込まれればどこでもOK)
use Carp::Always;追加

何が、どこから、どう呼び出されたのかが表示される
スタックトレースをゲット

SQLが怪しい場合 => Devel::KYTProf

プロファイリング用のモジュールですが、SQLクエリの文とプレースホルダの中身が表示されるため、デバッグに重宝します。

use Devel::KYTProf;を適当な場所に追加(読み込まれればどこでもOK)
use Devel::KYTProf;追加

SQLと実行時間が表示される
SQLの実行情報をゲット

怪しい構文、変数、関数をいろいろチェックしたい時 => (Devel::REPL, Carp::REPL)

REPLは乱暴に言えばプロンプトのことです。Devel::REPLは、シェルから使える"re.pl"コマンドで、単独のperlプロンプトを起動することができます。これは構文の動作(複雑な式の挙動など)を確認したい時に大いに役立ちます。

Carp::REPLはdieした場所や、プログラム中の任意の場所でプロンプトを起動します。変数の中身の確認と編集、関数の返り値のチェックなど、なんでもできるようになります。rubyのbinding.pryをご存知の方は、それのperl版がだいたいこれです。

※ 起動時に「モジュールくれ」と言われるので、Term::ReadLine::GnuまたはTerm::ReadLine::Perlも一緒にインストールしておきましょう。また、自分でインストールしたときにはFile::Nextへの依存関係が欠落していたので、別途インストールする必要がありました。今は修正されているかもしれません。

dieした時にプロンプトを起動する

perl -MCarp::REPL script.plと指定して起動するか、use Carp::REPL;を適当な場所に追加
use Carp::REPLの追加

dieしたときにプロンプトが起動する
dieするとREPLが起動

プロンプト内では、変数名を叩くだけで変数の中身がdumpされます。

プログラム中の任意の場所でプロンプトを起動する

use Carp::REPLとrepl関数の呼び出しを追加
repl呼び出しを追加

replが呼び出された時にプロンプトが起動する
プロンプトを操作して、変数を書き換えて続行したりもできる

変数を書き換えるなどしたあと、CTRL+Dで続行することができます。

まとめ

  • Carp::Always
    • エラーやスタックトレースの可視化
    • useするだけ
  • Devel::KYTProf
    • SQLの可視化
    • useするだけ
  • Devel::REPL
    • プロンプトで構文や式の動作を確認
    • re.plコマンド
  • Carp::REPL
    • プログラムの途中でプロンプトを起動
    • dieしたところで使うなら、perl -MCarp::REPL script.plまたはuseするだけ
    • repl関数を使って任意の場所で起動

他にもこんなのがあるよ、こっちのほうが便利だよ!というものがあればぜひコメントで教えて下さいmm
happy perl hacking :-)

追記:あとで見たら微妙に4種になってました・・すみませんでしたmm