跟踪程序运行情况,并将函数调用层次结构返回为json

时间:2019-03-18 07:30:25

标签: python json python-3.x debugging sys

下面是我的trace_calls函数,用于获取调用图的json格式输出。

我的输出是{"callgraph": ["function_1", "function_2", "c", "function_2", "retjson", "dumps", "encode", "iterencode"]}

包括程序包的内部函数("retjson", "dumps", "encode", "iterencode"),并且在挂接settrace之后被调用。

我想要的是将json作为返回{"callgraph": ["function_1", "function_2", "c", "function_2"]}

我已经尝试过的事情:-if event == 'return':,但是它并没有帮助跳过带有return的函数。 原因是文档内容:

  

“返回”

     

一个函数(或其他代码块)即将返回。本地跟踪函数被调用; arg是将返回的值;如果事件是由引发异常引起的,则为None。跟踪函数的返回值将被忽略。

def retjson(x):
    python2json = json.dumps({"callgraph": x})
    return python2json

def trace_calls(frame, event, arg):
    if event != ('call'):
        return
    co = frame.f_code
    func_name = co.co_name
    if func_name == ('write'):
        # Ignore write() calls from print statements
        return
    func_line_no = frame.f_lineno
    func_filename = co.co_filename
    caller = frame.f_back
    caller_line_no = caller.f_lineno
    caller_filename = caller.f_code.co_filename

    tree_list.append(func_name)
    tree_line_list.append(caller_line_no)
    x = json.dumps({"callgraph": tree_list})
    y = json.dumps({"line_no": tree_line_list})

    print ('Call to %s on line %s of %s from line %s of %s' % \
        (func_name, func_line_no, func_filename,
         caller_line_no, caller_filename))

    return trace_calls

def function_2():
    print ('in b()')

def function_1():
    print ('in a()')
    function_2()
    c()
def c():
    print ('in c()')


sys.settrace(trace_calls)

function_1()
function_2()
print(retjson(tree_list))

0 个答案:

没有答案