我可以使用linux perf获取python调用堆栈吗?

时间:2014-11-13 06:53:22

标签: python linux perf

例如,

    def test():
        print "test"

我使用了perf record -g -p $pid,但结果只是PyEval_EvalFrameEx。我怎样才能得到真实姓名" test"或者如果不能通过使用perf?

3 个答案:

答案 0 :(得分:4)

截至2018年,perf根本不支持读取Python堆栈帧(参见a 2014 Python mailinglist discussion)。

Python 3.6对Dtrace and Systemtap有一些支持。

另一种选择是Pyflame, a stochastic profiler for Python,它通过ptrace()对python调用栈进行采样。与Dtrace / Systemtap相比,您不需要额外的权限,它也适用于没有工具化支持而编译的Python版本。

当您在Pyflame中使用--threads选项时,您会看到调用C / C ++扩展的Python行,尽管堆栈跟踪在最后一个Python帧处停止。但也许这对你的用例来说已经足够了。

答案 1 :(得分:3)

你将无法使用perf来实现这一点,它专门用于连接Linux进程模型,解码这些堆栈帧等。它通过告诉你它正在执行函数PyEval_EvalFrameEx来做它应该做的事情。它必须使用特定于python的信息进行扩展才能实际解码Python的帧信息,这种情况不会发生。不幸的是,我还没有找到一个很容易调试Python和C / C ++模块的好方法。它通常是一个pdb,另一个是gdb。

答案 2 :(得分:1)