【问题标题】:lldb: how to call a function from a specific library/frameworklldb:如何从特定库/框架调用函数
【发布时间】:2014-02-01 11:30:37
【问题描述】:

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

我想调用特定库中的函数,类似于:

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 足够聪明。也就是说,如果有两个函数:void fn(int) 和 void fn(int, int),那么如果我调用 fn(10),将调用第一个版本,如果我调用 >p fn(10,20) 第二个版本将被调用。铸造也可以,即 p (void()(int))&fn (void ()(int)) $0 = 0x00000001000007d0 (testfn(int) at main.cpp:15); p (void(*)(int, int))&fn (void (*)(int, int)) $1 = 0x0000000100000800 (testfn(int, int) at main.cpp :20)

标签: macos gdb lldb


【解决方案1】:

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"

第一个地址(Address 下的那个)是函数在 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 用于可加载的二进制图像)、获取它们的地址、评估表达式等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2020-08-24
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多