为调试符号创建 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
所以我的问题是:
- 有没有更好的方法来解决这个问题?请注意,我没有源代码或目标文件来重新生成新的 dYSM。
- 是否有终端命令可以将我编辑的 dwarfdump 修补成 LLDB 可读调试符号文件?
干杯!
我不是很清楚你要达到什么目的。起初听起来好像您试图打破某些 class/selector 对的动态确定的实现,在这种情况下您可以这样做:
(lldb) break set -a `(void *) method_getImplementation((void *)class_getInstanceMethod([Foo class], @selector(bar)))`
请注意,您必须在 运行 完成程序并遇到断点后执行此操作,但是在 [=20] 之前您不会知道将要调用的具体实现=] 无论如何,所以这不是什么限制。
但仅仅修改 DWARF 中的名称实际上并不能达到这种效果。所以也许如果你多说一点你的实际目标,我们可以提供更多帮助。
关于问题 2,事后没有工具可以编辑 dSYM DWARF 内容。这不是很多人呼吁的东西。
我的最终目标是在 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
所以我的问题是:
- 有没有更好的方法来解决这个问题?请注意,我没有源代码或目标文件来重新生成新的 dYSM。
- 是否有终端命令可以将我编辑的 dwarfdump 修补成 LLDB 可读调试符号文件?
干杯!
我不是很清楚你要达到什么目的。起初听起来好像您试图打破某些 class/selector 对的动态确定的实现,在这种情况下您可以这样做:
(lldb) break set -a `(void *) method_getImplementation((void *)class_getInstanceMethod([Foo class], @selector(bar)))`
请注意,您必须在 运行 完成程序并遇到断点后执行此操作,但是在 [=20] 之前您不会知道将要调用的具体实现=] 无论如何,所以这不是什么限制。
但仅仅修改 DWARF 中的名称实际上并不能达到这种效果。所以也许如果你多说一点你的实际目标,我们可以提供更多帮助。
关于问题 2,事后没有工具可以编辑 dSYM DWARF 内容。这不是很多人呼吁的东西。