LLDB:在目标创建后执行python回调以注入符号

时间:2019-04-19 14:05:09

标签: lldb

我正在尝试在target create之后执行python函数,以便可以遍历目标的所有模块,从互联网上下载丢失的符号(基于GetUUIDString),然后覆盖{{ 1}}目录和下载路径。

不幸的是,我无法弄清楚如何在正确的时间实际调用一个函数,以使程序尚未执行,创建了目标并填充了GetSymbolFileSpec()并允许我修改符号。

是否有一些有关如何挂钩的文档?我知道,有一种理论上可以通过Shell脚本按需获取符号的方法,但是这种方法仅在macOS而非其他平台上实现。

1 个答案:

答案 0 :(得分:0)

您可能不想在target create上执行此操作,因为不能保证目标在实际运行之前就知道将要加载到其中的所有库。另外,您可能还想处理在程序运行时动态加载的库。做到这一点的真正地方是在Module add上(这是lldb中发生DebugSymbols的钩子)。

Linux和Windows似乎没有调出某些代理以引入调试符号的概念。它们的确会在/usr/local/debug中查找预缓存的符号,但是没有像dsymForUUID那样的调用机制。

如果您打算进行一点lldb黑客攻击,则添加这样的标注将非常简单。只需进行一个采用程序名称的设置即可。该程序将UUID作为输入,并返回调试信息的文件名作为输出。然后,您可以让lldb在lldb当前调用LocateMacOSXFilesUsingDebugSymbols的位置(在LocateSymbols.cpp中)运行它。

也许更简单的方法是添加一个target stop-hook来调用您编写的一些基于python的命令,该命令会查看模块列表并为已出现的任何新库获取调试信息。如果要使用它来调试正在运行的程序,则只需关心在控制权返回给用户之前添加符号。因此,停止钩将是执行此操作的合适位置。