【问题标题】:lldb "unable to resolve breakpoints" in private Objective-C classes?私有Objective-C类中的lldb“无法解析断点”?
【发布时间】:2018-03-14 21:37:06
【问题描述】:

作为 lldb 练习,我尝试将 lldb 附加到 Apple 的 macOS TextEdit.app 并在其中设置符号断点。我可以在 Foundation 类中设置断点。但是在私人课程中,我似乎总是无法将断点解析到任何实际位置。为什么?

我知道交付的可执行文件会被剥离,但我也知道不能剥离 Objective-C 符号名称,并且阅读了几篇解释如何“破解”应用程序的旧文章,看起来它对他们有用,尽管数据库。当我在 TextEdit 可执行文件上运行 otool -ov 时,会显示所有私有符号及其地址。

示例

看看它如何很好地适用于 Foundation 类:

(lldb) breakpoint set -F "-[NSString initWithFormat:]"
Breakpoint 1: where = Foundation`-[NSString initWithFormat:], address = 0x00007fff2c0c29d0
(lldb) breakpoint set -r '\[NSString .*\]$'
Breakpoint 2: 139 locations.

但是当我在私有 Document 类中尝试相同的方法时,或者在我使用 Steve Nygard 的 class-dump 找到的其中一种方法中,它失败了:

(lldb) breakpoint set -F "-[Document validateMenuItem:]"
Breakpoint 3: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.
(lldb) breakpoint set -r '\[Document .*\]$'
Breakpoint 4: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.

【问题讨论】:

    标签: objective-c macos reverse-engineering lldb


    【解决方案1】:

    目前,lldb 仅使用 ObjC 运行时数据来为在表达式解析器中调用方法时提供类型信息。它不会将其中找到的方法折叠到符号表中以进行断点查找。

    【讨论】:

    • 谢谢你,@Jim Ingham。您是说这是一个(尚未)在 lldb 中实现的功能吗?它是在 gdb 中实现的吗?
    • 理论上是否可以解决这个问题,获取 otool 报告中感兴趣的方法的地址,并在该地址设置断点?
    • 第一个问题,我们从未教过 Apple 的 gdb 出于任何目的读取 ObjC 运行时数据。我认为 FSF gdb 也不会这样做。我们当然可以将它添加到 lldb,尽管我目前没有计划。如果您想投票支持我们添加此功能,请向 Apple 的错误报告者提交雷达。
    • 我认为您可以使用从 otool 获得的地址,但请记住,库通常不会以静态基地址加载,因此您从二进制文件中获取的任何地址都必须滑动到库的实际加载位置。一旦您将程序运行到加载相关库的位置,lldb 的“图像列表”将向您显示库的幻灯片。
    • 再次感谢@Jim Ingham。所以我正在阅读 Mach-O 二进制偏移和幻灯片。
    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2015-06-23
    • 2014-05-06
    • 2011-12-02
    • 2015-09-16
    • 2020-11-27
    相关资源
    最近更新 更多