【问题标题】:lldb python handle breakpoint hitlldb python句柄断点命中
【发布时间】:2014-09-03 12:15:06
【问题描述】:

我正在浏览这本巨大的 LLDB python 参考手册,但仍然找不到如何处理我的代码命中的断点。 我的意思是,我想在遇到断点时运行我的 foo()。

请帮我写一些代码 sn-ps!

或者在 Python 参考手册中指出我需要的类。

谢谢!

【问题讨论】:

    标签: python debugging scripting lldb


    【解决方案1】:

    在页面上:

    http://lldb.llvm.org/python-reference.html

    有一段标题为:

    遇到断点时运行 Python 脚本

    其中有一些有用的信息。

    您正在做的是“向断点添加命令”。用于此的 lldb 命令是“断点命令添加”。所有基本的 lldb 命令都采用“名词 [子名词 [...]] 动词选项”的形式;知道这可能有助于将您想要做的事情转换为命令集中该操作的命令所在的位置。无论如何,“断点命令添加”的帮助还有其他可能有用的示例。

    然后精简版是,制作一个包含具有此签名的函数的python模块:

    breakpoint_function (frame, bp_loc, dict)
    

    使用以下命令将该模块带入 lldb:

    (lldb) command script import "path to your .py file"
    

    如果您已将 PYTHONPATH 设置为指向它,您也可以在“命令脚本导入”中使用模块名称,但与 Python 的“导入”不同,您不必这样做,该命令将负责你。

    然后做一个断点,并使用“br com a”将你的函数添加到它:

    (lldb) br com a -F MyModule.breakpoint_function

    现在当断点被命中时,你的函数将被调用并使用以下参数:

    “frame”参数是命中断点的帧。如果需要,您可以从框架中获取线程,从而获得完整的堆栈。

    “bploc”参数是命中断点的“断点位置”。在 lldb 中,一个“断点规范”(这是您使用“断点集”设置的)可以解析到许多位置。例如,“源模式”断点可能会匹配代码中的许多源模式。因此,您可能想知道实际击中的是哪一个。

    “dict”选项是为了让我们可以松鼠一些东西并将其传递给 Python,它应该不理会。​​p>

    要记住的另一件事是,尽管脚本解释器(可通过“脚本”命令访问)定义了 lldb.thread、lldb.frame 等便利变量,但在运行断点命令时不会设置这些变量.因此,如果您在构建命令原型时在脚本解释器中使用了这些变量,如果您在断点命令中需要它们,则必须从传入的帧中找到它们。

    请注意,Python 断点命令目前在 Xcode 6 中不起作用,但应该在它完成时修复。

    【讨论】:

    • 谢谢!这是一个不错的选择。它工作正常。不过,我一直在寻找一个纯 python 解决方案,就像在 PaiMei 中一样。但是这个东西有效,所以谢谢你!
    • 啊,抱歉,我没听懂。最近的 lldb 有这个功能:SBBreakpoint.SetScriptCallbackFunction。因此,使用 SBTarget.BreakpointCreateBy... 在 Python 中设置断点,然后在断点上调用 SetScriptCallbackFunction,传入 Python 函数的全名(包括模块)。我不记得确切的添加时间,它在 Xcode 中6 和来自 lldb.llvm.org 的当前 TOT lldb。可能在 Xcode 5 中?在某个时候,我会弄清楚如何制作一个可以调用 Python 的版本,但现在名称应该可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2014-07-20
    • 1970-01-01
    • 2014-12-25
    • 2014-08-29
    • 2017-03-28
    • 1970-01-01
    相关资源
    最近更新 更多