lldb - LLDB:在目标创建后执行 python 回调以注入符号
问题描述
我试图在之后执行一个python函数,target create
这样我就可以遍历目标的所有模块,从互联网上下载缺失的符号(基于GetUUIDString
),然后覆盖GetSymbolFileSpec()
我下载的目录和路径。
不幸的是,我无法弄清楚如何在正确的时间实际调用一个函数,以便程序尚未执行,创建并lldb.target.modules
填充目标并让我修改符号。
是否有一些关于如何挂钩的文档?我知道有一种理论上的方法可以通过 shell 脚本按需获取符号,但这仅在 macos 而不是其他平台上实现。
解决方案
您可能不想这样做,target create
因为无法保证目标在实际运行之前会知道将加载到其中的所有库。此外,您可能还想处理在程序运行时动态加载的库。真正做到这一点的地方是 Module add (这是 DebugSymbols 的钩子在 lldb 中发生的地方。)
看起来 Linux 和 Windows 没有调用某些代理来拉入调试符号的概念。他们确实会查找/usr/local/debug
预缓存的符号,但没有像 dsymForUUID 那样进行调用的机制。
如果您准备进行一些 lldb 黑客攻击,那么添加这样的标注将非常简单。只需进行一个采用程序名称的设置。该程序会将 UUID 作为输入,并将调试信息的文件名作为输出返回。然后你可以让 lldb 在 lldb 当前调用 LocateMacOSXFilesUsingDebugSymbols(在 LocateSymbols.cpp 中)的同一个地方运行它。
也许更简单的方法是添加一个target stop-hook
调用您编写的一些基于 python 的命令,该命令查看模块列表并获取已显示的任何新库的调试信息。如果你想用它来调试正在运行的程序,你只需要在控制权返回给用户之前添加符号。因此,停止钩子将是执行此操作的合适位置。
推荐阅读
- ios - React native fs无法将文件上传到API
- c# - 创建 CIMSession 时出现 System.InvalidProgramException 错误 C#
- groovy - 如何在不首先分配给变量的情况下调用 shell.parse() 上的函数?例如 shell.parse().someFunction()
- database - 在 MySQL EER-Diagram 中表示多值属性
- css - 在函数输出之后对元素选择器应用较少的函数
- react-native - React Native 如何让图片占据全屏?
- python - DNA sequence Dotplots
- r - 使用 dplyr 对 lubridate hms 进行排序
- swift - Swift 中的 Kotlin 枚举类
- owl-carousel-2 - 猫头鹰旋转木马不会在移动视图上滚动?