◼︎ 概要
Perlにはオプションでステップ実行機能が使える
難しい処理などを1行ずつコードを実行していくことができる
是非デバッグ(debug)時に活用したい
◼︎ メリット
- どんな処理でエラーになっているのかが容易にわかる
- 何行目のこの変数ではこういう値が入っているなどがわかる
- 難しい処理でも1行ずつコードを追うことができる
- オプションで「-d」を指定するだけなので容易に試せる
- ステップ実行中に変数の値を変えられる
◼︎ デバッグ方法
// perlのデバッグ 「-dを指定する」 $ perl -d debug.pl // 終了 > q // 現在読み込まれているモジュールとバージョン番号を表示 > M // メソッド > m // 全てのサブルーチンを表示 > S // パッケージスコープ > V // パターンによって制限できる変数 > X // 現在位置のコードを見る // さらにコードを見るには再度vをタイプする > v // 周辺ソースコードが表示されるようになる(バックスラッシュは消してくださいmm) > \{\{v // 行移動する > l (行番号) 例: > l 5 // 見ている場所を実行しようとしている場所にリセットする > . // 変数を表示 > p (変数) 例: > p $data // 次の実行可能文に進む > s // ハッシュ変数を見やすく表示 > x \%data // シングルステップ > s // シングルステップ(サブルーチン内部は検査しない) > n // 変数の変更 > $a=3
◼︎ デバッグ実践
今回は以下のソースを使って見る
#!/usr/local/bin/perl use strict; use warnings; my $num = 3; for(my $i=1;$i<=3;$i++) { print $num*$i."\n"; } # 3の倍数を出力するプログラム # 実行例 # $ perl debug.pl # 3 # 6 # 9
ステップ実行してみる
$ perl -d debug.pl Loading DB routines from perl5db.pl version 1.33 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(debug.pl:5): my $num = 3; DB<1> n main::(debug.pl:7): for(my $i=1;$i<=3;$i++) { DB<1> n main::(debug.pl:8): print $num*$i."\n"; DB<1> n 3 main::(debug.pl:8): print $num*$i."\n"; DB<1> n 6 main::(debug.pl:8): print $num*$i."\n"; DB<1> n 9 Debugged program terminated. Use q to quit or R to restart, use o inhibit_exit to avoid stopping after program termination, h q, h R or h o to get additional info. DB<1> q
シングルステップ実行できていることがわかる
nではなくsで実行していくと関数があった時に関数の内部まで追うことができる
色々使ってみる
$ perl -d debug.pl ... デバッグに不要な文面は中略 ... main::(debug.pl:5): my $num = 3; DB<1> n main::(debug.pl:7): for(my $i=1;$i<=3;$i++) { // 周辺のソースコードを表示するようにする DB<1> \{\{v // \{\{v (バックスラッシュは消してくださいmm)を叩いたことによってnを実行した際にソースコードも表示されている DB<2> n main::(debug.pl:8): print $num*$i."\n"; auto(-1) DB<2> v 5: my $num = 3; 6 7: for(my $i=1;$i<=3;$i++) { 8==> print $num*$i."\n"; 9 } 10 11 # 3の倍数を出力するプログラム 12 # 実行例 13 # $ perl debug.pl 14 # 3 DB<2> n 3 main::(debug.pl:8): print $num*$i."\n"; auto(-1) DB<2> v 5: my $num = 3; 6 7: for(my $i=1;$i<=3;$i++) { 8==> print $num*$i."\n"; 9 } 10 11 # 3の倍数を出力するプログラム 12 # 実行例 13 # $ perl debug.pl 14 # 3 // $numの値を変更してみる DB<2> $num=100 // $numの値を変更したことにより出力結果が変わっている DB<3> n 200 main::(debug.pl:8): print $num*$i."\n"; auto(-1) DB<3> v 5: my $num = 3; 6 7: for(my $i=1;$i<=3;$i++) { 8==> print $num*$i."\n"; 9 } 10 11 # 3の倍数を出力するプログラム 12 # 実行例 13 # $ perl debug.pl 14 # 3 DB<3> n 300
コメントを書く
コメント一覧