【问题标题】:LLDB Python API call function in C codeC代码中的LLDB Python API调用函数
【发布时间】:2016-06-02 17:24:38
【问题描述】:

例如,在编写 GDB 宏时,我可以给出如下内容:

list_iterate $arg0

如果我的 C 代码中的 list_iterate() 函数看起来像

list_iterate(list_node *)

在 LLDB Python API 中,我该如何做同样的事情,即从 C 代码调用和执行函数?我已经搜索了文档,但似乎找不到这样的东西

【问题讨论】:

    标签: python gdb lldb


    【解决方案1】:

    SBFrame::EvaluateExpression 是你想要的功能。比如:

    (lldb) script
    >>> options = lldb.SBExpressionOptions()
    >>> result = lldb.frame.EvaluateExpression('printf("Hello there.\\n");', options)
    Hello there.
    >>> print result
    (int) $1 = 13
    

    注意,如果您正在编写脚本(或 Python 命令等),请不要使用 lldb.frame,您可以从您的进程中获取选定的帧,或者如果您正在编写命令,请使用传递给SBExecutionContext。见:

    https://lldb.llvm.org/use/python-reference.html

    了解更多详情。

    【讨论】:

    • 还想问一件小事。我的函数的结果是一个指针,我能够成功执行你的命令。 result.GetValue() 返回一个地址。但是,当我运行 result.GetChildMemberWithName("data").GetValue() (我的结构包含一个成员数组 int data[2])时,我得到了 None。但我已经通过控制台确认它不是 None 并且具有价值。这是我编写的代码的缺陷还是结果 SBValue 指针存在问题?
    • GetChildMemberWithName 为您提供了一个代表 2 元素数组“数据”的 SBValue。数组没有值——数组的值是什么意思?相反,他们有孩子——数组的元素。因此,如果您想查看 data[0],您将使用 GetChildMemberWithName("data") 获取“data”的 SBValue 并在其上调用 GetChildAtIndex(0)。从该调用返回的 SBValue 是一个标量,并且会有一个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多