首页 > 解决方案 > LLDB:在目标创建后执行 python 回调以注入符号

问题描述

我试图在之后执行一个python函数,target create这样我就可以遍历目标的所有模块,从互联网上下载缺失的符号(基于GetUUIDString),然后覆盖GetSymbolFileSpec()我下载的目录和路径。

不幸的是,我无法弄清楚如何在正确的时间实际调用一个函数,以便程序尚未执行,创建并lldb.target.modules填充目标并让我修改符号。

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

标签: lldb

解决方案


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

看起来 Linux 和 Windows 没有调用某些代理来拉入调试符号的概念。他们确实会查找/usr/local/debug预缓存的符号,但没有像 dsymForUUID 那样进行调用的机制。

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

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


推荐阅读