2010年1月31日日曜日

内骨格 1.90

内骨格の 1.90 を公開した。

1 .90 - 2010/01/31
  • Tar系アーカイブの展開で失敗するケースがあったのを修正
  • アーカイブファイルがオープンされっぱなしになってしまう問題の調査のために "_RefererTree"コマンドを追加。
  • ネイティブライブラリを Cygwin の 1.7.1(0.218/5/3) を使ってビルドするようにした。
  • アップデートパッケージのZIPファイルによっては、ネットワークアップデートできないケースがあるのを修正。
1.89 以前のバージョンの、ネットワークアップデート機能に問題があって、今回はネットワークアップデートに失敗してしまう。
フリーソフトなので、割り切って、手でアップデートしてもらうことにした。( お手数おかけします。 )

また、ずっと気になっていながら、なかなか修正できていなかった、[アーカイブファイルオープンされっぱなし問題]の調査のために 、こんかい _RefererTree というコマンドを追加した。

python の gc モジュールを使って、特定のクラスのオブジェクトが残存しているか、残存しているならどのオブジェクトから参照されているのか、を探索するためのデバッグ用の機能だ。

内骨格のコマンド入力欄で、_RefererTree;ZipInfo;5 のように入力すると、ZipInfoクラスの残存具合が以下のように出力される。





ソースは以下のような感じだ。

    def command_RefererTree( self, args ):
   
        kwd = args[0]
   
        max_depth = 5
        if len(args)>1:
            max_depth = int(args[1])
   
        known_id_table = {}
       
        gc.collect()
        objs = gc.get_objects()
       
        def isRelatedObject(obj):
            if type(obj).__name__ == kwd:
                return True
            if type(obj).__name__ == 'instance':
                if obj.__class__.__name__ == kwd:
                    return True
            return False           
           
       
        def dumpReferer(obj,depth):
           
            if known_id_table.has_key(id(obj)):
                return
            known_id_table[id(obj)] = True
           
            str_type = str(type(obj))
           
            if str_type.find("'instance'")>=0:
                str_type += " " + str(obj.__class__)
            print "   " * depth, str_type

            if depth==max_depth: return

            referers = gc.get_referrers(obj)
            for referer in tuple(referers):
                dumpReferer(referer,depth+1)
           
       
        print "---- referer --------"
       
        for obj in tuple(objs):
            if isRelatedObject(obj):
                dumpReferer(obj,0)

        print "-----------------------------"

0 件のコメント:

コメントを投稿