自作のデバッグ関数

Top
プログラミングで大切なのは、コード作成後のデバッグです。
デバッガを利用するのも面倒くさい場合は、print文で済ませますが、
自作のデバッグ関数があると、とても便利で頼りになります。

今回は、自分専用のデバッグ関数を作成してみましょう!
それから、モジュール化して何時でも使えるようにしますよ!

でも、デバッガを使いたい人は、無料オンラインのデバッガをどうぞ!
オンライン・デバッガー
オンライン・デバッガー(解説)




DownLoad ダウンロードして環境変数のPYTHONPATHを通してください (動画に説明あり) 【機能説明】 dbgモジュールをimportして、 変数の値を調べたい位置にdbg(変数)を挿入してください。 (呼出サンプル)を見て下さいね! 画面と、ファイルに出力されます。 ファイル名は、カレントのフォルダでdbg.txtになってます 以下のようなフォーマットです <module>は、ルート(関数になっていない)からの呼出です myDbg.py func123:12 (0, 0) myDbg.py func123:12 (1, 1) myDbg.py func123:12 (2, 3) myDbg.py <module>:18 {'Func123_Status': 3} 【使い方】 importする from dbg import dbg,dbgKw 例) トレースのみ dbg() 通常 data1 =123 data2= "abcdefg" dbg( data1,data2 ) キーワードを付ける dbgKw( キーワード=値 ) dbgKw( Func123_Status=st )

呼出サンプル
from dbg import dbg,dbgKw

def func123():

    sum2 =0
    for i in range( 3 ):
        sum2 += i
        dbg( i, sum2 )
    
    return sum2

st = func123()

dbgKw( Func123_Status = st )


◆表示内容( dbg.txtファイル内容 )
dbg-sample.py func123:8 (0, 0)
dbg-sample.py func123:8 (1, 1)
dbg-sample.py func123:8 (2, 3)
dbg-sample.py <module>:14 {'Func123_Status': 3}
本体 3つの関数から出来ていますが、かなり少ないステップ数なので自由にカスタマイズして 使ってみて下さい
import inspect
import os,sys

'''
------------------------------------------------------------
デバッグ関数
(自由にカスタマイズして使って下さい)

画面(コマンドラインのコンソール)と
ファイル(dbg.txt)に出力されます。

フォーマットは以下(このスクリプトを実行した場合)
dbg.py :76 ()                           # 呼出 dbg()
dbg.py main:72 (1, 2)                           # 呼出 dbg( a,b )
dbg.py func:68 {'i': 123, 'data': 'コバヤシ'}   # 呼出 dbgKw( i=i, data=data )



FNAME
 ファイル名、フォルダを追加すれば指定フォルダに出力されます

dbgWrt関数のfmtを変更して好きなフォーマットにして下さい
------------------------------------------------------------
'''

FNAME = "dbg.txt"           # File Name


#ファイル内容をクリアしている
#(importした時に一度だけ実行されます)
f =open( FNAME,"w" )
f.close()


def dbgWrt( arg, fileNm, funcNm, lineNo  ):

  # Output Format (ファイル名、関数名、行番号、引数) 
  fmt = "%s %s:%s %s" %( fileNm, funcNm, lineNo, arg) 
  print( fmt, flush=True )
  with open( FNAME, "a" ) as f:
    f.write( fmt + "\n" )
    

def dbg( *arg ):
  frame = inspect.currentframe().f_back
  fileNm = os.path.basename(frame.f_code.co_filename)
  funcNm = frame.f_code.co_name
  lineNo = frame.f_lineno
  dbgWrt( arg, fileNm, funcNm, lineNo )


def dbgKw( **kwa ):
  frame = inspect.currentframe().f_back
  fileNm = os.path.basename(frame.f_code.co_filename)
  funcNm = frame.f_code.co_name
  lineNo = frame.f_lineno
  dbgWrt( kwa, fileNm, funcNm, lineNo )




if  __name__ == "__main__":
    
    def func():
      i=123
      data ="コバヤシ"
      dbgKw( i=i, data=data )

    def main():
      a,b,c =(1,2,3)
      dbg( a,b )
      func()


    dbg()               # 引数無しでトレースを行う
    main()

©2022 Kenji Kobayashi YouTube