【问题标题】:MacOSX Instruments to profile Python codeMacOSX Instruments 分析 Python 代码
【发布时间】:2014-01-29 03:05:00
【问题描述】:

MacOSX Xcode Instruments 非常适合分析本机代码。但是,我的调用堆栈中还有大量 Python 调用。我可以让 Instruments 感知 Python 吗?

我能想到的一个解决方案是,当它看到一些 PyEval_EvalFrameEx 框架时,它会在其局部变量/参数中查找以分隔不同的 Python 调用并向我显示一些调用信息。

我问的不仅仅是 Python 分析器。我想分析我的本机代码。但在本机代码分析中,我想添加一些进一步的智能来分析和翻译 Python 堆栈帧。

【问题讨论】:

  • 你试过RunSnakeRun吗?我个人从未使用过它,但它似乎正是您想要的。
  • @KronoS:我想我已经看到了类似的 cProfile 和导出器到 KCacheGrind 的解决方案。但是:(1)我还想查看本机 C 代码配置文件,即两者结合。 (2) 我也想特别是。使用 Xcode Instruments。
  • 也许我不完全明白你在问什么,但也许你可以用 python -m cProfile myscript.py 运行你的脚本?然后您可以将输出保存到日志文件
  • @ollien:那我看不到本机 (C/C++/ObjC) 函数调用。

标签: python macos instruments xcode-instruments


【解决方案1】:

根据这个stackoverflow answer,Instruments 是dtrace 的GUI 前端。有Apple Documentation 证实了这一点,还有一些关于 dtrace 的 OS-X 特定文章在Big Nerd Ranch 等地方。

patches 可以在编译之前应用于 CPython 源代码以检测它以用于 dtrace。似乎已经或曾经支持在homebrew 中使用 dtrace 自动构建新的 python,但是现在谷歌搜索,我没有找到对当前 python 版本(2.7.10, 3.4/3.5)。我还没有尝试过,所以也许当前的配方在构建时只适用于--with-dtrace 开关。

PyTexas 2013 上有一个演讲:dtrace, Python and You,其中谈到了安装包含 dtrace 支持的 python(特别是在 Mac 上演示),以及在命令行上使用 dtrace。

我认为一旦你安装了一个支持 dtrace 的 python,在运行它时,你应该能够在 Instruments 中看到和使用它。如果您将 python 解释器添加到 OS X 应用程序(作为 .framework 或其他形式的链接),如果该 python 在编译之前应用了 dtrace 补丁,我也认为它可以使用在 dtrace 中。我都没有尝试过,但鉴于我对 dtrace 的了解,我相信它应该可以工作。如果我确认这是真的,我会回帖。

【讨论】:

    【解决方案2】:

    没有 MacOSX 工具来分析 Python 代码。 就个人而言,我使用 cProfile。它是一个名为cProfile 的内部分析器。您可以通过以下任一方式使用它:

    import cProfile
    cProfile.run('print "Hello World!"')
    

    python -m cProfile your_own_script.py
    

    结果会是这样的:

    >>> cProfile.run('print "Hello World!"')
    Hello World!
             2 function calls in 0.000 seconds
    
       Ordered by: standard name
    
       ncalls  tottime  percall  cumtime  percall filename:lineno(function)
            1    0.000    0.000    0.000    0.000 <string>:1(<module>)
            1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
    

    编辑:如果您正在寻找本机级别的调用。然后你应该转移到strace(对于Linux)和dtruss(对于Mac OSX)或其他类似的工具。基本上,您可以将 Python 脚本包装在 strace 调用中,您将能够查看所有“本机”C/C++ 调用。 对于其他 linux 系统使用:

    strace -fetrace=open python your_script.py
    

    或者如果您使用的是 Mac OSX:

    dtruss -f -t open python your_script.py
    

    我希望这会有所帮助!

    【讨论】:

    • 这不是问题所在。问题是关于本机代码的。
    • 如果您正在寻找本机级别的调用。然后你应该转移到strace 或其他类似的工具。基本上,您可以将 Python 脚本包装在 strace 调用中,这样您就可以查看所有“本机”C/C++ 调用。
    • 那么,我如何在strace 中看到 Python 调用?我不只是想在那里看到PyEval_EvalFrameEx 左右,我想看到真正的Python 函数。 (另外,我问的不是strace,而是MacOSX Instruments,但这并不重要。)
    • 我找到了Traceback。不确定是否有帮助。
    • 这仅适用于 in Python,并打印 Python 堆栈跟踪。不知道这应该如何与strace 一起使用。
    【解决方案3】:

    有一个很棒的新 GUI 分析器,名为 PyVmMonitor。我还没有成功地将它附加到我正在运行的应用程序中,但我一直在使用它从命令行生成和分析配置文件,如下所示:

    python /Applications/PyVmMonitor.app/Contents/MacOS/public_api/pyvmmonitor --profile=yappi my_app.py
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多