为调试符号创建LLDB别名

时间:2016-02-18 06:34:18

标签: objective-c debugging lldb debug-symbols dwarf

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

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

-[Foo baz]

将在以下地址设置断点:

(lldb) b -[Foo baz]

我目前解决此问题的方法是使用 dsymutil 函数转储symfile:

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

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

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

现在,我可以轻松修改包含dwarfdump dump.dYSM/Contents/Resources/DWARF/ExecName

AT_name属性

但是,在我以这种“美化”格式获得调试信息后,我不知道如何重新生成dYSM。

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

-[Foo bar](lldb) target modules add

所以我的问题是:

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

1 个答案:

答案 0 :(得分:1)

我并不完全清楚你想要实现的目标。它听起来像你试图打破动态确定的某些类/选择器对的实现,在这种情况下你可以这样做:

        <plugin>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.10.3</version>
            <!--
            <configuration>
                <doclet>ch.raffael.doclets.pegdown.PegdownDoclet</doclet>
                <docletArtifact>
                    <groupId>ch.raffael.pegdown-doclet</groupId>
                    <artifactId>pegdown-doclet</artifactId>
                    <version>1.1.1</version>
                </docletArtifact>
                <useStandardDocletOptions>true</useStandardDocletOptions>
            </configuration>
            -->
        </plugin>

注意,在您运行程序并达到断点后,您必须执行此操作,但之后您将无法了解将要调用的特定实现,直到你还是跑,所以这不是一个限制。

但是只是在DWARF中修改名称实际上并没有实现这种效果。所以,如果你多说一点你的实际目标,我们可以提供更多的帮助。

关于问题2,事后没有工具可以编辑dSYM DWARF内容。那不是那种需要的东西。