Отслеживание программы во время ее выполнения и возврат иерархии вызовов функций в виде json - PullRequest
0 голосов
/ 18 марта 2019

Ниже приведена моя функция trace_calls, используемая для получения вывода в формате json файла callgraph.

Мой вывод {"callgraph": ["function_1", "function_2", "c", "function_2", "retjson", "dumps", "encode", "iterencode"]}

, который включает внутренние функции ("retjson", "dumps", "encode", "iterencode") пакетов икак он был вызван после перехвата settrace.

То, что я хочу, это json as return {"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))
...