macos - lldb:如何从特定库/框架调用函数

标签 macos gdb lldb

问题:在项目中,我们有特定于框架/动态库的本地化功能。也就是说,它们具有相同的名称,但从不同的包/文件夹中获取资源

我想从特定库中调用一个函数,类似于:

lldb> p my_audio_engine.framework::GetL10nString( stringId );
lldb> expr --shlib my_audio_engine.framework -- GetL10nString();
lldb> p my_audio_engine`L10N_Utils::GetString(40000)

但所有这些变体都不起作用。

在标签中添加 gdb 希望相同的语义(如果存在)也适用于 lldb。

最佳答案

lldb 的表达式解析器目前没有等效于 gdb 的 foo.c::function 元符号来编码来自特定源文件的函数。

请随时在 bugreporter.apple.com 提交错误请求。它会被我之前提交的那个欺骗,但是欺骗是对功能的投票,我们还没有解决这个问题,因为除了我之外没有人要求它......

对于随机数,您将不得不手动执行此操作。这是一个调用 printf 的愚蠢示例,我碰巧知道它在 OS X 上的 libsystem_c.dylib 中。首先,我在我感兴趣的共享库中找到了地址:

(lldb) image lookup -vn printf libsystem_c.dylib
1 match found in /usr/lib/system/libsystem_c.dylib:
        Address: libsystem_c.dylib[0x0000000000042948] (libsystem_c.dylib.__TEXT.__text + 266856)
        Summary: libsystem_c.dylib`printf
         Module: file = "/usr/lib/system/libsystem_c.dylib", arch = "x86_64"
         Symbol: id = {0x00000653}, range = [0x00007fff91307948-0x00007fff91307a2c), name="printf"

第一个地址(地址下的地址)是 dylib 中函数的地址,而不是它在运行程序中加载的位置。这不是立即有用的。如果我愿意,我可以计算库的加载偏移量并将其应用于文件地址,但幸运的是,符号地址范围中的第一个地址是正在运行的程序中的地址,所以我不必这样做。 0x00007fff91307948 是我想要的地址。

现在我想调用那个地址。我分两步执行此操作,因为它使类型转换更容易,例如:
(lldb) expr typedef int (*$printf_type)(const char *, ...)
(lldb) expr $printf_type $printf_function = ($printf_type) 0x00007fff91307948

现在我有一个可以反复调用的函数:
(lldb) expr $printf_function("Hello world %d times.\n", 400)
Hello world 400 times.
(int) $2 = 23

如果您要一遍又一遍地这样做,您可以编写一个 Python 函数,从感兴趣的库中找到符号,并构造调用正确函数的表达式。 Python API 包括从特定模块获取符号的调用(用于可加载二进制图像的 lldb-speak)、获取它们的地址、评估表达式等。

关于macos - lldb:如何从特定库/框架调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21096045/

相关文章:

objective-c - 如何确定我的 Cocoa Desktop 应用程序是否位于登录时打开的应用程序列表中?

python - 将 MacBook 更新到 macOS Catalina 后,Anaconda 出现问题

debugging - 调试嵌入式软件(核心转储)

c++ - GDB 报告 C++ 对象的构造函数中的参数地址错误

ios - 获取错误 "-[NSThread threadDictionary]: message sent to deallocated instance"

linux - linux 上的 mdfind 等价物?

macos - Mac 上的 Puppeteer/chromium 长期提示 "accept incoming network connection?"

gdb - 在 gdb 中运行多个命令

c++ - 数据库 : Unable to resolve breakpoint in Hello World example

memory-address - lldb:打印变量的地址