【问题标题】:How does LLDB implement the set breakpoint function?LLDB如何实现设置断点功能?
【发布时间】:2019-01-08 20:15:15
【问题描述】:

我想通过LLDB实现set-breakpoints功能,我已经阅读了lldb源代码并且理解了部分实现。我的问题是源代码设置断点在哪里实现? lldb 如何与 DWARF 交互?

【问题讨论】:

    标签: c++ llvm breakpoints lldb dwarf


    【解决方案1】:

    这类问题可能更适合向 lldb-dev 邮件列表 (lldb-dev@lists.llvm.org) 提出。如果你最终做了一些你想提交给 lldb 的事情,无论如何你都需要在那里讨论......

    但是,简而言之:lldb Breakpoint 中处理实际设置断点的部分是断点搜索内核。 lldb 中用于断点设置的搜索内核始终是 BreakpointResolver 类的子类。您可以阅读 BreakpointResolver.h 中的 cmets,了解有关其工作原理的更多详细信息。 File & Line 断点设置解析器是 BreakpointResolverFileLine(在 BreakpointResolverFileLine.cpp 中)。

    然后这个 Target::CreateBreakpoint: 的重载

      lldb::BreakpointSP CreateBreakpoint(const FileSpecList *containingModules,
                                          const FileSpec &file, uint32_t line_no,
                                          lldb::addr_t offset,
                                          LazyBool check_inlines,
                                          LazyBool skip_prologue, bool internal,
                                          bool request_hardware,
                                          LazyBool move_to_nearest_code);
    

    用于获取文件和行断点的规范并构造适当的 BreakpointResolver,并从中创建一个断点。最后,CommandObjectBreakpoint::CommandObjectBreakpointSet 编组命令行参数并将它们传递给适当的 Target::CreateBreakpoint 函数,以便从命令行创建断点。

    询问“lldb 如何与 DWARF 交互”有点过于分散,无法给出连贯的答案。 DWARF 有很多活动部件,lldb 在很多方面使用 DWARF……你能更具体地问你想知道什么吗?顺便说一句,如果您还没有仔细阅读 DWARF 规范(来自 http://dwarfstd.org),您可能希望在深入了解 lldb 对 DWARF 的使用之前先阅读一下。

    【讨论】:

    • 非常感谢。我再次阅读了lldb源代码,我对lldb如何在内存中设置断点(INT 3)感到困惑并且没有找到工具,你能帮忙弄清楚吗?再次感谢。
    • lldb中直接设置断点的代码在Process::EnableSoftwareBreakpoint中。但请注意,如果可以避免,lldb 不会直接这样做。例如,当与 gdb-remote 协议存根(macOS 和 Linux 上的标准)交谈时,它会查询存根(macOS/iOS 上的调试服务器或 Linux 上的 lldb-server)以查看它是否支持 zZ 数据包,如果支持而是使用它。如果调试存根知道断点会更好(例如,如果 lldb 意外消失,它可以删除它们)。
    • 感谢您的耐心等待。我发现 BroadcasterImpl::BroadcaseEvent() 和 PrivateBroadcaseEvent 在添加断点时被调用,你能帮我弄清楚事件响应的代码实现吗?
    • 在断点事件的情况下,lldb 不要求任何人监听它们。除了发送它们之外,lldb 对事件不做任何事情。它们的存在是为了让使用 lldb 并且还提供 lldb 命令行界面的 IDE(例如 Xcode)可以获知使用命令行命令对断点状态所做的更改并将其反映在其 UI 中。
    猜你喜欢
    • 2021-11-19
    • 2021-05-27
    • 1970-01-01
    • 2020-01-30
    • 2019-12-18
    • 2018-01-09
    • 1970-01-01
    • 2016-08-16
    • 2014-09-28
    相关资源
    最近更新 更多