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

时间:2018-07-29 08:49:14

标签: ios iphone debugging lldb

我正在用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

1 个答案:

答案 0 :(得分:1)

target modules add将二进制文件(及其dSYM,如果有的话)加载到它知道的lldb二进制文件池中。但是dylib尚未加载到您的下级进程中-您将无法在其中运行功能。

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

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

(10是RTLD_GLOBAL|RTLD_NOW,v。dlfcn.h)。还有一种SB API方法可以执行此操作,SBProcess::LoadImage不需要您查看dlopen的详细信息。例如

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