例如,
def test():
print "test"
我使用了perf record -g -p $pid
,但结果只是PyEval_EvalFrameEx
。我怎样才能得到真实姓名" test"或者如果不能通过使用perf?
答案 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)