2018年8月15日水曜日

プログラムをデバッグする話

データステップにデバッグオプションを付けると,デバッガが起動します.
1stepごとに実行し適宜変数の値を確認したり,指定した箇所まで実行したりすることが出来ます.
excelで言う所のデバッグトレースですかね.

以下のプログラムを実行すると,データステップにdebugオプションが付いているので
データステップデバッガが起動します.

data hoge  ;
    val1 = 1 ; val2 = 2 ; type = "A" ; output ;
    val1 = 1 ; val2 = 2 ; type = "B" ; output ;
    val1 = 1 ; val2 = 2 ; type = "C" ; output ;
run ;

data hoge2 / debug ;
    set hoge ;
    if TYPE = "A" then VAL3 = VAL2 - VAL1 ;
    if TYPE = "B" then VAL3 = VAL2 + VAL1 ;
    if TYPE = "D" then VAL3 = VAL2 * VAL1 ;
run ;





 





  















デバッガが起動すると,debugger log とdebugger sourceの二つのwindowが立ちあがります.

debugger logの下部にある点線の下にコマンドを入力し,デバッグを行います.
debugger sourceの黒線部分が今実行する直前のステートメントです.

ココで出来ることは,以下の感じです.
もちろん他にも機能はありますが,とりあえずこれだけです.
  • 指定した行数分ステートメントを実行(stepコマンド)
  • 指定した変数の値を確認(examineコマンド)
  • ステートメントを指定して,そのステートメントまで実行(breakコマンド)
  • 指定した変数の値が変わるまで実行(watchコマンド)
  • デバッガを終了(quitコマンド)
breakコマンドはexcelで言う所のbreakpointとほぼ同じだと思います.
 デフォルトではエンターキーがstep1に対応しているので,
debugger logでエンターをたたくと1ステートメントだけ実行されます.
以下の画像ですと134行目に黒線があるので,133行目まで実行されている状態です.
この状態でexamineコマンドでVAL3を見ると,値が1になっています.
examineコマンドは黒線がある直前まで実行された段階での変数の値を返してくれます.
ですのでdebugger logにステップ:行132カラム24の時にすべての変数の値を確認すると,VAL3は欠測になります.
(まだ132行目のTYPEが"A"の時にVAL3を演算する処理が実行されていないため.)
 _N_=1のため,今は1レコード目を読みこんでいる状態でデバッグをしていることが分かります.

データステップデバッガも例にもれず,1レコード読みこんで,すべてのステートメントを実行して,
また次のレコードを読みこんで...と進んでいきます.
確認したいレコード番号が大きいとそこまで実行しないといけません.
いちいちエンターキーを叩いて1レコードごとに実行しているとキリが無いので,
watch,breakなどを駆使して確認箇所まで実行するのが良いのではないでしょうか.



















マクロのデバッグにも使える感じですね.

参考資料
<http://www.sas.com/offices/asiapacific/japan/service/help/pdf/lebaseutilref.pdf>
dataステップデバッガの項目

0 件のコメント:

コメントを投稿