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

wuw*_*uwl 27 python linux perf

例如,

    def test():
        print "test"
Run Code Online (Sandbox Code Playgroud)

我用过perf record -g -p $pid,但结果只是一切PyEval_EvalFrameEx.如何才能获得真实姓名"test"或者如果不能使用perf?

max*_*zig 7

截至 2018 年,perf根本不支持读取 Python 堆栈帧(参见2014 年 Python 邮件列表讨论)。

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

另一个替代方案是Pyflame,这是一个用于 Python 的随机分析器,它通过ptrace(). 与 Dtrace/Systemtap 相比,您不需要额外的权限,它也适用于在没有工具化支持的情况下编译的 Python 版本。

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

编辑: Pyflame在 2019 年底左右被放弃。一个黑客新闻跟帖提到了以下方案: