lldb 无法在导入的 dylib 中查找符号

lldb cannot lookup symbol in imported dylib

我正在使用 lldb 在 arm64 上调试 C 程序,为了实现我自己的调试功能,我编写了一个独立的调试帮助程序,将其编译为 dylib 并使用以下方法将其导入 lldb:

(lldb) target modules add debugHelper.dylib

然而当我调用dylib中声明的函数时,lldb错误:

(lldb) expression debugPrint()
 error: Couldn't lookup symbols:
 _debugPrint

如果我输入随机函数名称(例如 foo):

(lldb) expression foo()
error: use of undeclared identifier 'foo'

,这让我相信导入 dylib 确实成功了,因为 debugPrint 不是 undeclared identifier


// debugHelper.c

#include <stdio.h>


int debugPrint() {
    printf("%s\n", "Debug info printed! \n");
    return 0;
}

debugHelper.dylib 编译为:

$ xcrun --sdk iphoneos cc debugHelper.c -o debugHelper.dylib -dynamiclib -arch arm64 -g

我还用 nm 验证了 debugHelper.dylib 确实有 _debugPrint 符号:

$ nm debugHelper.dylib
0000000000007f2c T _debugPrint
                 U _printf
                 U dyld_stub_binder

(lldb) image list 的结果:

[263]... debugHelper.dylib.dSYM/Contents/Resources/DWARF/debugHelper.dylib

target modules add 将二进制文件(及其 dSYM,如果有的话)加载到它知道的 lldb 二进制文件池中。但是 dylib 还没有加载到你的下级进程中——你将无法 运行 那里的功能。

相反,运行 dlopen() 在您的过程中:

(lldb) p (int)dlopen("debugHelper.dylib", 10)

(即 10 是 RTLD_GLOBAL|RTLD_NOW,诉 dlfcn.h)。还有一个 SB API 方法可以做到这一点,SBProcess::LoadImage 不需要您查找 dlopen 的详细信息。例如

(lldb) script lldb.process.LoadImage(lldb.SBFileSpec("debugHelper.dylib", False), lldb.SBError())