94
88

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2012-12-26

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

94
88
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
94
88

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?