为调试符号创建 LLDB 别名

Create LLDB Alias for Debug Symbol

我的最终目标是在 LLDB 中修改 Objective-C 程序的符号文件。我想增加方法名称,以便可以使用新的唯一名称来引用调试符号文件中的现有方法。

例如,如果有一个名为-[Foo bar]的方法,我当然可以使用(lldb) b -[Foo bar]打破这个方法,但是,我想为这个方法创建一个"alias"命名为 -[Foo baz],所以当我在 lldb 中执行以下命令时:

(lldb) b -[Foo baz]

将在以下地址设置断点:

method_getImplementation(class_getInstanceMethod([Foo class], @selector(bar)))

我目前解决这个问题的方法是使用 dsymutil 函数转储符号文件:

dsymutil /path/to/executable -o dump.dYSM

从那里,我可以使用 dwarfdump 命令将输出美化为我可以实际编辑的内容。

dwarfdump dump.dYSM/Contents/Resources/DWARF/ExecName

现在我可以轻松编辑包含 -[Foo bar]

AT_name 属性

但是,在我获得这种 "prettify" 格式的调试信息后,我不知道如何重新生成 dYSM。

如果我可以重新生成编辑后的 ​​dYSM,我希望使用以下任一方法将它重新粘贴到 LLDB 中:

(lldb) target modules add(lldb) target symbol add

所以我的问题是:

  1. 有没有更好的方法来解决这个问题?请注意,我没有源代码或目标文件来重新生成新的 dYSM。
  2. 是否有终端命令可以将我编辑的 dwarfdump 修补成 LLDB 可读调试符号文件?

干杯!

我不是很清楚你要达到什么目的。起初听起来好像您试图打破某些 class/selector 对的动态确定的实现,在这种情况下您可以这样做:

(lldb) break set -a `(void *) method_getImplementation((void *)class_getInstanceMethod([Foo class], @selector(bar)))`

请注意,您必须在 运行 完成程序并遇到断点后执行此操作,但是在 [=20] 之前您不会知道将要调用的具体实现=] 无论如何,所以这不是什么限制。

但仅仅修改 DWARF 中的名称实际上并不能达到这种效果。所以也许如果你多说一点你的实际目标,我们可以提供更多帮助。

关于问题 2,事后没有工具可以编辑 dSYM DWARF 内容。这不是很多人呼吁的东西。