【问题标题】:Jumping to a line number in lldb跳转到 lldb 中的行号
【发布时间】:2013-03-03 00:51:51
【问题描述】:

如何跳转到 lldb 中的特定源代码行?在 gdb 中,它将是“跳转 X”,其中 X 是行号,但我能找到的 lldb 的唯一参考是 http://lldb.llvm.org/lldb-gdb.html,它说:

在当前程序计数器前跳过 8 个字节(指令 指针)。请注意,我们使用反引号来评估表达式和 将标量结果插入 LLDB。

(gdb) jump *$pc+8
(lldb) register write pc `$pc+8`

FWIW,在 MacOS 上,用“rip”替换“pc”似乎可行。

但是使用这种方法跳转到特定的行似乎相当困难。有没有更好的方法可以跳入lldb?

【问题讨论】:

  • PC(程序计数器)和 IP(指令指针)都是(概念上)相同的东西,它们只是在不同架构中使用的不同名称。 PC 用于基于 PowerPC 和 ARM 的系统(后者包括所有当前的 iOS 设备)。在 x86 上使用 IP,除了 IP 是 16 位时代的原始术语——32 位版本称为 EIP,64 位版本称为 RIP。因此,对于 iOS 目标,您使用 $pc,但对于 Mac OS X,您使用 $eip(32 位程序)或 $rip(64 位程序)。

标签: c++ objective-c xcode macos lldb


【解决方案1】:

几天前,在 lldb 存储库中添加了一个如何在 Python 中执行此操作的示例。见http://llvm.org/svn/llvm-project/lldb/trunk/examples/python/jump.py

将该文件的内容保存到您的主目录,可能类似于 ~/lldb/jump.py 并使用类似的命令将其加载到您的 lldb 中

command script import ~/lldb/jump.py

(或将其放入您的~/.lldbinit 文件中)您将拥有一个jump 命令。

请注意,使用 Objective-C 程序中的 ARC(自动引用计数),您可以通过四处跳转来超级容易地搞砸您的程序 - 许多看起来无害的跳转实际上并非如此。这绝对属于“用户小心”/“祝你好运”类别的调试器技巧。

【讨论】:

  • 谢谢,这是一个开始。似乎大部分工作,但我已经遇到了一些问题。有讨论区吗?令我困惑的是,在这方面 gdb 似乎比 lldb 好得多。我只是想我错过了一些基本的东西。
  • 您可以尝试将邮件发送到 lldb-dev 邮件列表,详情请参阅lldb.llvm.org。前几天 Sean 编写了 Python 脚本作为示例实现 - 我想这将是一种“补丁被愉快地接受”类型的对话,但请随时详细说明您遇到的问题。
【解决方案2】:

作为更新,我在这里留下了 LLDB 教程中的一个新功能:http://lldb.llvm.org/tutorial.html

最后,lldb 运行直到行或帧退出步进模式: (lldb) 线程直到 100 该命令将在当前帧中运行线程,直到它到达该帧中的第 100 行,或者如果它离开当前帧则停止。这与 gdb 的“直到”命令非常接近。

因此,(lldb) thread until <lineno> 为当前线程解决了问题。

另外,(lldb) help thread until 包含其他选项。

【讨论】:

    猜你喜欢
    • 2018-11-26
    • 2016-01-15
    • 2016-11-05
    • 2012-07-17
    • 2015-11-29
    • 2010-09-22
    • 2023-03-30
    • 2017-08-07
    • 1970-01-01
    相关资源
    最近更新 更多