2018年7月22日日曜日

python debugger (pdb vs npdb)

パイソンの標準デバッカー(pdb)とクラウドデバッカー(npdb)

■デバックについて

プログラムを書き実行してみると、うまくいかない事が多い。
1回で動く事は、稀でありそのためにデバック作業が発生するのである。

自分の経験(40年前から)から、全然かわらないが
一つ言える事がある、以前より大変になった事である。

人間社会も同じことだけど、プログラム環境もより複雑になり多くの時間を
簡単なことに費やしています。

では、デバックの基本とは、

①プログラムの流れが正しいかを確認
②変数(データ)が正しく設定されているか
③後、厄介なのは、タイミングである
 以前(大昔)は、必ずプログラムの流れは1つであったが、
 スレッド、プロセス、タイマー、割り込みなど、ある処理が動作している時に
 他の流れを考えながらデバックをしなけらばいけない。

①、②は画面などに表示をしてみる事で、だいたい大丈夫。
③はタイミングなので、ファイルにプログラムの流れをタイムスタンプと一緒に書き込みを
 おこない確認をするしかない。
 へたにデバッカーに頼ると思いもかけない時間を浪費してしまう。


■デバッカーは必要か?

 自分は、NOと言いたいがどんなもんだろうか?
 自分が若い時は、コボルという事務処理言語かなり主流だった

 勿論、デバッカーなど無い大型コンピュータでプログラムをタイピストに依頼して
 マシンタイムに動作させ、結果を確認。
 問題があれば、Display文などを、お粗末なエディターで数行いれて、
 実行待ち、複数人数で使用しているから結果はすぐにはでない。

 そしてその日の割り当てられたマシンタイムは終わり、結果印刷物を会社に持って帰り
 再検討、机上デバックする。

 こんな感じであった、勿論再検討する際にはデバックをおこなう、机上で変数名に現在何が
 入っているか?もしこちらに処理が移ってしまっていたらどうなるのか?

 かなり机上で確認しているから、実際のマシンタイムではうまく動いていくのである。

 3回ぐらいマシンで正常動作させて、次にはテストフェーズにはいる。
 テストケースを机上で考えて、前述のように周到な準備をおこない。
 テストをおこなう。

 今思うとなつかしい。
 

■pdb





変数名
変数名=

順番に、

step, next, return, continue, break
であるなんとなく想像できる単語である

stepは単語の意味どうり
1行ごとだけど、日が暮れちゃうね

nextはstepよりちょっと早くできる、関数、メソッドを通過する
関数値等を確認は、nextを実行後代入された内容をみてみる
(いまさらですが、現在の実行を示す位置は、実行前ですよ)

returnは、stepで関数内部に入り、途中で関数から出たくなった場合に使う。
pdbでは、関数をリターンする前に止まるので、ここでも関数値を確認できる

「関数値の確認方法」

continue文
cでオーケーだが、contでもいい。
時にはcontと打ってデバックをしたいと思うが、自分の性格上だめである

cont,continue(スペル間違いが無ければいいが)を打つ余裕が、時短で良いデバックができるのも
真実であるように思える。

自分は煙草を吸わないが、家事や身の回り、机まわり等を掃除、整頓するのも良いのではないかな。

また、難問にぶつかってしまったら、散歩、買い物をするのも良いのでは。。
(自分は、買い物でアルコールを買うので、そこまでのデバックなってしまうので。。。どうか)

おすすめは、最初に「contする」です
パイソンの場合は、コンパイルしないでの実行時にエラーが発生するからです。

もしかすると、最初で天国に行くことができて、弾みがでて細かなデバックができることも
多々あるからです。

うまくいかない場合は、適当なところにbreak文でストップしてみましょう。

以外とその途中まで行っていないケースは自分の場合多かったです。

最初にimport
次にファイルの入力
関数をコールしてなかった、条件がかなり違っているなど。

様々ですが、本当はプルグラムを印刷して机上デバックすればかなり早いのですが。。。

時代ですね。。。

今日は、ここまで終わりです。

歯科に行く予定なので、一時的な公開をしますよ




以下は、未完ですよ
(上もこれからだけど)



これだけをマスターすれば、快適なデバックが行える。


しかし、もっと単純化すれば以下の3単語(コマンド)だけでよいのかもしれません。
tbreak
cont
p 変数名

tbreakとは、一時的なブレークポイントである

書き方は、tbreak ファイル名:行番号でファイル名を省略することもできます

次に、「cont」コマンドでブレークポイントまで処理を実行

実行後に変数の内容を確認する

※p 変数名で変数の内容が表示されるが、変数名がデバッカーのコマンド
重複しない場合は、pは省略可能であります。





最初に、対象のスクリプを表示してみましょう。


次に対象の関数内で処理を止めてみる
(いわゆるブレークポイントの設定である)

そこ箇所の変数名を表示してみる

関数の値を確認する



次回は、例題をあげてデバックしてみたいですね


例題1

1〜10までを加算するプログラム


例題2

文字列を扱う






デバック、デバッカーとは

プログラムは、命令文である
命令文には、決まり事があり人には間違いがある

そのためにデバックが必要なのだ。




0 件のコメント:

コメントを投稿