Perlのステップ実行方法まとめ

◼︎ 目次

  1. 概要
  2. メリット
  3. ステップ実行 方法
  4. ステップ実行 実践

◼︎ 概要

Perlにはオプションでステップ実行機能が使える
難しい処理などを1行ずつコードを実行していくことができる
是非デバッグ(debug)時に活用したい

◼︎ メリット

  • どんな処理でエラーになっているのかが容易にわかる
  • 何行目のこの変数ではこういう値が入っているなどがわかる
  • 難しい処理でも1行ずつコードを追うことができる
  • オプションで「-d」を指定するだけなので容易に試せる
  • ステップ実行中に変数の値を変えられる

◼︎ デバッグ方法

// perlのデバッグ 「-dを指定する」
$ perl -d debug.pl

// 終了
> q

// 現在読み込まれているモジュールとバージョン番号を表示
> M

// メソッド
> m

// 全てのサブルーチンを表示
> S

// パッケージスコープ
> V

// パターンによって制限できる変数
> X

// 現在位置のコードを見る
// さらにコードを見るには再度vをタイプする
> v

// 周辺ソースコードが表示されるようになる
> {{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を叩いたことによって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


Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です