2016-08-19 7 views
2

私は自分のサーバーに小さなデバッグ補助を追加しました。トレースバックは複数行のコマンドの1行だけを表示します

File "/home/...../base/loop.py", line 361, in run 
    self.outputs.fd_list,(), sleep) 

それほど参考になっていない。それは、このようないくつかの不完全な行が含まれてtraceback.format_stack()

から取得したスタックトレースをログに記録します。

、ソース線360と361:

rlist, wlist, unused = select.select(self.inputs.fd_list, 
            self.outputs.fd_list,(), sleep) 

だけ一行は、スタックトレースの一部とすることができる場合、私は、関数名(ここではselect.select)とライン360があるため、正しいものであると言うでしょうスタックは関数を呼び出すことによって作成されます。

とにかく、(論理)行全体を印刷することをお勧めします。または少なくともいくつかのコンテキスト(たとえば、2行前)。それは可能ですか?もちろん、十分な努力だけで意味します。

行継続文字\を追加しようとしましたが、成功しませんでした。


EPILOGUE:の場合を除き、

def print_trace(): 
    for fname, lnum, func, line in traceback.extract_stack()[:-1]: 
     print('File "{}", line {}, in {}'.format(fname, lnum, func)) 
     try: 
      with open(fname) as f: 
       rl = f.readlines() 
     except OSError: 
      if line is not None: 
       print(" " + line + " <===") 
      continue 
     first = max(0, lnum-3) 
     # read 2 lines before and 2 lines after 
     for i, line in enumerate(rl[first:lnum+2]): 
      line = line.rstrip() 
      if i + first + 1 == lnum: 
       print(" " + line + " <===") 
      elif line: 
       print(" " + line) 
+0

Canあなたはあなたのスタックトレースのより多くの行を投稿しますか? –

+0

@LaurentLAPORTE他の行は非常によく似ています。基本的にスタックトレース全体は2回繰り返されたテンプレートの繰り返しです。第1行目にはファイル「file」、行N、func'、第2行目には対応するソースコード行が含まれている。 – VPfB

答えて

1

「十分な労力で」これが可能です。 EDIT

File "C:\Users\dartypc\AppData\Roaming\PyScripter\remserver.py", line 63, in <module> 
    if __name__ == "__main__": 
     main() <==== 
    File "C:\Users\dartypc\AppData\Roaming\PyScripter\remserver.py", line 60, in main 
     t = SimpleServer(ModSlaveService, port = port, auto_register = False) 
     t.start() <==== 
    if __name__ == "__main__": 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\utils\server.py", line 227, in start 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\utils\server.py", line 139, in accept 
    File "C:\Users\dartypc\AppData\Roaming\PyScripter\remserver.py", line 14, in _accept_method 
    class SimpleServer(Server): 
     def _accept_method(self, sock): 
      self._serve_client(sock, None) <==== 
    class ModSlaveService(SlaveService): 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\utils\server.py", line 191, in _serve_client 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 391, in serve_all 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 382, in serve 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 350, in _dispatch 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 298, in _dispatch_request 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 528, in _handle_call 
    File "<string>", line 420, in run_nodebug 
    File "C:\DATA\jff\data\python\stackoverflow\traceback_test.py", line 31, in <module> 
     print_trace() 
    foo() <==== 

:VPfBは、解析する必要が少し "ハック" であるextract_stackの使用を示唆していない出力

import traceback,re,os,sys 

r = re.compile(r'File\s"(.*)",\sline\s(\d+)') 

def print_trace(): 
    # discard the 2 deepest entries since they're a call to print_trace() 
    lines = [str.split(x,"\n")[0] for x in traceback.format_stack()][:-2] 

    for l in lines: 
     m = r.search(l) 
     if m != None: 
      sys.stdout.write(l+"\n") 
      file = m.group(1) 
      line = int(m.group(2))-1 
      if os.path.exists(file): 
       with open(file,"r") as f: 
        rl = f.readlines() 
        tblines = rl[max(line-2,0):min(line+3,len(rl))] 
        # read 2 lines before and 2 lines after 
        for i,tl in enumerate(tblines): 
         tl = tl.rstrip() 

         if i==2: 
          sys.stdout.write(" "+tl+" <====\n") 
         elif tl: 
          sys.stdout.write(" "+tl+"\n") 


def foo(): 
    print_trace() 

foo() 

:しかし、それはハックのような

チェックこの例です文字列、ちょうどトレースバック情報(テキストメッセージを再構築する必要がありますが、それは良いです)を使用して四重奏を取得します。

import traceback,os,sys 


def print_trace(): 
    # discard the 2 deepest entries since they're a call to print_trace() 

    for file,line,w1,w2 in traceback.extract_stack()[:-2]: 
     sys.stdout.write(' File "{}", line {}, in {}\n'.format(file,line,w1)) 

     if os.path.exists(file): 
      line -= 1 
      with open(file,"r") as f: 
       rl = f.readlines() 
       tblines = rl[max(line-2,0):min(line+3,len(rl))] 
       # read 2 lines before and 2 lines after 
       for i,tl in enumerate(tblines): 
        tl = tl.rstrip() 

        if i==2: 
         sys.stdout.write(" "+tl+" <====\n") 
        elif tl: 
         sys.stdout.write(" "+tl+"\n") 


def foo(): 
    print_trace() 

foo() 
+0

ちょうどいいところで:-)私は 'regexpsなしでファイルと行を取得するのに' extract_stack'を使いますが、そのアイデアに+1します。 – VPfB

+0

は、代替コードを追加しました。チップ(と+1 :)のおかげです。 –

+0

私は質問に同様のコードを追加しました。行番号が1または2の場合、 'if i == 2:'は正しくありません。 – VPfB

0

traceback.format_exception_only関数形式のみ1行:私はこの機能を使用するつもりだジャン・フランソワ・ファーブルの答えと彼のコードに基づいて SyntaxError

関連する問題