debugging 如何自动跟踪所有函数调用和参数?

14ifxucb  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(175)

为了为我的代码构建一个专门的调试器,我想跟踪代码中的一些函数,并记录它们在每次调用中接收到的参数。
我希望能够做到这一点,而不需要向每个函数添加代码行,甚至不需要在所有函数周围添加装饰器,而是在整个运行过程中设置跟踪。
这有点类似于您可以在sys模块中使用sys.settrace执行的操作:https://docs.python.org/2/library/sys.html
除了据我所知跟踪不包括函数的参数。
所以我想写一个函数,看起来像这样:

def tracing_func(func_name, args):
    if func_name in ['func', 'foo']:
         log_func_args(func_name, args)

其中log_func_args将其记录在文件中以供以后分析。
然后将此函数设置为每当调用代码中的任何函数时都会调用,并带有函数的名称和参数。
这能做到吗?

mec1mxoz

mec1mxoz1#

所以sys.settrace做得很好:
https://docs.python.org/2/library/sys.html#sys.settrace
还有一个例子:
https://pymotw.com/2/sys/tracing.html
注意你传递给settrace的函数必须返回一个对自身的引用(或者返回一个对另一个函数的引用,以便在该作用域中进一步跟踪)。

ubof19bj

ubof19bj2#

你应该尝试python-hunter。可以通过设置环境变量就地配置或神奇地配置。我刚刚从cookbook编译的一些脚本:

~/bin/ptrace

#!/usr/bin/env bash

PYTHONHUNTER="Q(stdlib=False),\
 ~Q(kind='line'),\
 ~Q(filename_contains='site-packages'),\
  Q(filename_contains='$(pwd)'),\
  action=CallPrinter(force_colors=True)" \
"$@"

像这样执行:

pip3 install --user hunter
$ ptrace ./traceme.py 
    ./traceme.py:0     call      => <module>()
    ./traceme.py:37    call         => MyClass()
    ./traceme.py:39    return       <= MyClass: None
    ./traceme.py:46    call         => main()
    ./traceme.py:43    call            => foo(arg=10)
    ./traceme.py:44    return          <= foo: '10'
10
    ./traceme.py:39    call            => my_method(self=<__main__.MyClass object at 0x7f0c65646510>, arg=10, keyword=None)
    ./traceme.py:41    return          <= my_method: '10 and None'
10 and None
['./traceme.py']
    ./traceme.py:49    return       <= main: None
    ./traceme.py:52    return    <= <module>: None

相关问题