我正在用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
答案 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())